2016-12-09 63 views
0

我已經結構如下文件:MongoDB的變化字段類型

> db.orders.find().limit(1).pretty() 
{ 
     "_id" : ObjectId("5846bf0e141be215b814f64a"), 
     "date_add" : ISODate("2016-10-10T11:55:24Z"), 
     "associations" : { 
       "order_rows" : [ 
         { 
           "product_id" : "31", 
           "product_quantity" : "1", 
         }, 
         { 
           "product_id" : "133", 
           "product_quantity" : "1", 
         } 
       ] 
     }, 
} 

,而我能夠在「DATE_ADD」字段從字符串更改與已經幫助下ISODate回答了提問計算器我被困在:

如何將「product_quantity」的字段類型更改爲Integer?

我試過在蒙戈外殼下面:

db.orders.find().forEach(function(x){ 
x.associations.order_rows.product_quantity = new NumberInt(x.associations.order_rows.product_quantity); 
db.orders.save(x); 
}); 

然後我試圖用PyMongo,雖然我是能夠提取文檔和使用字典的方法和一個for循環遍歷列表並更改值,我不知道如何將文檔更新回數據庫。

在mongo shell或python中的解決方案將有巨大的幫助。

謝謝你的時間和精力!

+0

[在蒙戈更新字段類型(的可能的複製http://stackoverflow.com/questions/36429475/update-field-type- in-mongo) – styvane

+0

你是對的。應該更徹底地搜索,雖然我的主要問題是如何到達列表中的元素。 –

回答

1

使用replace_one,與文檔的_id爲準繩:

from pymongo import MongoClient 

collection = MongoClient().test.c 

# Sort to avoid seeing a doc multiple times if the update causes it to move. 
for doc in collection.find().sort('_id'): 
    rows = doc.get('associations', {}).get('order_rows', []) 
    for row in rows: 
     if 'product_quantity' in row: 
      row['product_quantity'] = int(row['product_quantity']) 

    collection.replace_one({'_id': doc['_id']}, doc)