2014-02-21 138 views
0

的2個嵌套數組的MongoDB更新我目前正在開發,我們正在使用的MongoDB我是新來的,而我面臨許多挑戰,當涉及到複雜的更新對象內部

這是我們收集訂單的應用程序:

{ 
    "_id" : ObjectId(), 
    "company" : String, 
    "employee" : String, 
    "office" : String, 
    "status" : String, 
    "subOrders" : [ 
    { 
     "products" : [ 
      { 
       "productId" : ObjectId(), 
       "name" : String, 
       "price" : String, 
       "status" : String 
      } 
     ], 
     "tax" : Int, 
     "subTotal" : Int, 
     "total" : "Int, 
     "status" : String, 
     "orderNote" : String 
    } 
    ] 
} 

我們需要致力於更新如下

update the subOrders.products.status to something (for example : delivered) 

其中

company = "x company" and office = "y office" and subOrders.products.productId = "z id" 

任何人都可以請向我們提供一個乾淨的代碼,可以處理這個查詢

請不要提供鏈接的網頁或網站,除非他們事先瞄準一個非常類似的問題

感謝

回答

1

你可以嘗試這樣的事情(這將是巨大的,但是...看問題的更新部分):

db.coll.update(
    { company: "x company", office: "y office", "subOrders.products.productId": "z id"}, 
    { $set: { "subOrders.$.products.$.status": "delivered" } } 
) 

你也能讀這個DOCUME ntation有關更新操作:http://docs.mongodb.org/manual/reference/method/db.collection.update/

更新:
行動..很抱歉,但位置運算符($)不與嵌套數組工作...你可以看到它在JIRA以及在documentation
一些相關問題:1,2
如果您的情況可能,您可以使用"subOrders.$.products.0.status"而不是"subOrders.$.products.$.status"。但是,如果您對模式添加了一些更改並且無需更新嵌套數組中的文檔,那將會更好。
但總的來說,更新語法看起來像前面所示。

更新2:
對於發現只有一個文件,只更新一個產品的status僅在一個亞目,你可以做這樣的事情:

var productIdForUpdate = "z id"; 
var doc = db.coll.findOne({ company: "x company", office: "y office", "subOrders.products.productId": productIdForUpdate }); 
top: 
for(var i = 0; i < doc.subOrders.length; i++) { 
    var subOrder = doc.subOrders[i]; 
    for(var j = 0; j < subOrder.products.length; j++) { 
     var product = subOrder.products[j]; 
     if (product.productId == productIdForUpdate) { 
      eval('db.coll.update({ _id: doc._id }, { $set: { "subOrders.' + i + '.products.' + j + '.status": "delivered" } })'); 
      break top; 
     } 
    }  
} 

或:

var productIdForUpdate = "z id"; 
var doc = db.coll.findOne({ company: "x company", office: "y office", "subOrders.products.productId": productIdForUpdate }); 
top: 
for(var i = 0; i < doc.subOrders.length; i++) { 
    var subOrder = doc.subOrders[i]; 
    for(var j = 0; j < subOrder.products.length; j++) { 
     var product = subOrder.products[j]; 
     if (product.productId == productIdForUpdate) { 
      product.status = "delivered"; 
      db.coll.save(doc); 
      break top; 
     } 
    }  
} 

顯示的代碼僅在一個subOrder中更新具有特定索引的產品。如果您想要更新多個文檔或多個subOrder ...或多個產品,則應該對此代碼添加一些更改。

+0

感謝您編輯我注意到的答案,並且我意識到嵌套數組的$操作符不起作用,如果我們有需要更新的確切產品的索引,則可以使用第二種選擇,所以讓我們將問題更改爲此: 如果我們有以上所有標準,我的意思是: {company:「x company」,office:「y office」,「subOrders.products.productId」:「z id」} 是否有可能獲得索引與條件匹配的subOrders.products數組,然後在索引更新的幫助下 – Siavosh

+0

感謝您的回答,儘管它需要一些修改才能使其工作 – Siavosh