首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >MongoDB向上插入$in

MongoDB向上插入$in
EN

Stack Overflow用户
提问于 2021-08-26 14:39:34
回答 2查看 184关注 0票数 0

我有一堆我想要插入的特定产品ids的记录。根据以前的计算,我希望记录该产品在当前周/年中的类型。

问题是,除了一次一次之外,我找不出一种方法来做这件事。现在我在做:

代码语言:javascript
代码运行次数:0
运行
复制
a_group.forEach(p => {
    db.abc.update({
        product_id: p._id,
        year: 2021
    }, { 
        $set: { 
            'abc.34': 'a'
        }
    }, {
        upsert: true
    });
});

其中a_group只是一组产品。

对于大型产品数组来说,这真的很重。它只执行a_group.length重新插入操作。

理想情况下,我想做这样的事情:

代码语言:javascript
代码运行次数:0
运行
复制
db.abc.update({
    product_id: { $in: a_group.map(p => p._id) },
    year: 2021
}, {
    $set: {
        'abc.34': 'a'
    }
}, {
    upsert: true,
    multi: true
});

它将看到a_group是一个数组,并试图匹配并重新插入数组中的每个项。但那不管用。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-27 00:59:32

这里的问题是,您需要为_id的每个离散值单独插入。

从医生那里:

a向上插入:

  • 更新与查询筛选器
  • 匹配的文档,如果查询筛选器

没有匹配,则插入文档。

在插入时,如:

代码语言:javascript
代码运行次数:0
运行
复制
updateMany(
    {a:{$in[1,2,3]}},
    {$set:{b:true}},   
    {upsert: true}
)

如果存在包含a: 3的文档,那么它将匹配查询筛选器,因此将更新一个文档,并且不会发生插入。

如果没有任何文档与传递给$in的任何值匹配,则将对单个新文档进行向上插入。由于查询无法确定您想要的a值,所以它将创建一个包含{b:true}的文档,但不会对a进行定义。

您可能需要的是一次对数据库的单次调用就可以执行许多重新插入操作的大容量操作。

使用mongosh shell,看起来可能如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
let ops = [];
a_group.forEach(p => {
   ops.push(
    { updateOne:
       {
         filter: {
                  product_id: p._id,
                  year: 2021
         },
         update: {$set: {'abc.34': 'a'}},
         upsert: true
    }
   );
});
db.abc.bulkWrite(ops)

检查正在使用的驱动程序文档,看看如何进行大容量操作。

票数 0
EN

Stack Overflow用户

发布于 2021-08-26 16:09:18

根据您的代码,我认为a_group是对象数组,因为您在forEach中使用了p._id,所以您应该从a_group导出_id并推入新的数组,例如productsId并替换

代码语言:javascript
代码运行次数:0
运行
复制
product_id: { $in: a_group }

使用

代码语言:javascript
代码运行次数:0
运行
复制
product_id: { $in: productsId },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68940629

复制
相关文章

相似问题

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