2016-02-28 90 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();