2016-02-28 2 views
0

У меня есть следующий документ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 что-то не так с запросом или же upsert работает по-другому? Я пытался путем добавления/удаления id поддокумента, но он все равно не работает. Что я пытаюсь сделать, так это добавить поддокумент заказа для основного документа с именем «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();