2016-02-28 89 views
0

我已經或做UPSERT的工作方式不同?我試圖通過添加/刪除以下文件MongoDB的UPSERT失敗

{ 
    "_id" : ObjectId("56d2f6e83b6c835ebf12de33"), 
    "name" : "john", 
    "age" : 50, 
    "places" : [ 
     "a", 
     "b", 
     "c" 
    ], 
    "orders" : [ 
     { 
      "_id" : 1, 
      "ordernumber" : 1, 
      "price" : 100, 
      "quantity" : 2 
     }, 
     { 
      "_id" : 2, 
      "ordernumber" : "2", 
      "price" : 1400.0000000000000000, 
      "qty" : 10.0000000000000000 
     }, 
     { 
      "_id" : 1.0000000000000000, 
      "ordernumber" : "2", 
      "price" : 1400.0000000000000000, 
      "qty" : 1.0000000000000000 
     }, 
     { 
      "_id" : "1", 
      "ordernumber" : "2", 
      "price" : 1400.0000000000000000, 
      "qty" : 1.0000000000000000 
     } 
    ] 
} 

發行以下更新插入一個新的子文檔,而不僅僅是更新document.Is有毛病查詢id字段的子文檔,但它仍然does not work.What我想要做的是爲名稱爲「john」的主文檔添加訂單子文檔,如果訂單確實存在,它會得到更新。

db.mx1.update(
{"name":"john"}, 
{ 
    "$addToSet":{ 
     "orders": 
     { 
      "_id":"1", 
      "ordernumber":"2", 
      "price":1400, 
      "qty":1 
     } 
    } 
}, 
    {"upsert":"true"} 
    ); 

回答

0

$addToSet操作需要被添加到只有當它是獨特的陣列整個子文檔,所以你不能認爲這是一個部分匹配部分更新

你可以做到這一點與"Bulk Operations API"如下

var bulk = db.mx1.initializeOrderedBulkOp(); 

// if we find the match order _id, update this order 
bulk.find({name: 'john', 'orders._id': 1}).updateOne({ 
    {$set: {'orders.$': {_id: 1, ordernumber: '2', price: 1400, qty: 1}}} 
}); 

// if we cannot find match order _id, insert the new one 
bulk.find({name: 'john', 'orders._id': {$ne: 1}}).updateOne({ 
    {$addToSet: {orders: {_id: 1, ordernumber: '2', price: 1400, qty: 1}}} 
}); 

bulk.execute();