Mongodb upsert失败

时间:2016-02-28 13:40:13

标签: mongodb

我有以下文件

{
    "_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
        }
    ]
}

发布以下更新插入一个新的子文档,而不仅仅是更新文档。查询有问题或者upsert的工作方式有所不同吗?我尝试添加/删除子文档的id字段,但它仍然无法正常工作。我想尝试什么do是为主文档添加名称" john"的订单子文档。如果订单确实存在,则会更新。

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

1 个答案:

答案 0 :(得分:0)

$addToSet运算符要求将整个子文档添加到数组中,只有它是唯一的,因此您不能将其视为部分匹配部分更新< / em>的

你可以使用下面的"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();