首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb upsert失败

Mongodb upsert失败
EN

Stack Overflow用户
提问于 2016-02-28 21:40:13
回答 1查看 271关注 0票数 0

我有一份下面的文件

代码语言:javascript
复制
{
    "_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
        }
    ]
}

发出update insert一个新的子文档而不是仅仅更新document.Is查询有什么问题,或者upsert的工作方式不同?我试着添加/删除子文档的id字段,但它仍然不work.What我正在尝试做的是为名为"john“的主文档添加order子文档,如果订单确实存在,它将被更新。

代码语言:javascript
复制
db.mx1.update(
{"name":"john"},
{
    "$addToSet":{
        "orders":
        {
          "_id":"1",
            "ordernumber":"2",
            "price":1400,
            "qty":1
        }
    }
},
    {"upsert":"true"}
   ); 
EN

回答 1

Stack Overflow用户

发布于 2016-02-28 22:16:07

$addToSet运算符要求只有在子文档是唯一的情况下,才将整个子文档添加到数组中,因此不能将其视为部分匹配或部分更新。

您可以使用"Bulk Operations API"执行此操作,如下所示

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35683238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档