Mongodb:一次同时上传多个文档(使用$ in这样的键)

时间:2018-09-20 18:31:20

标签: arrays mongodb insert upsert

我偶然发现MongoDB中有一个有趣的行为:

当我跑步时:

db.getCollection("words").update({ word: { $in: ["nico11"] } }, { $inc: { nbHits: 1 } }, { multi: 1, upsert: 1 })

如果不存在,它将创建“ nico11”,并将nbHits增加1(如预期)。

但是,当我跑步时:

db.getCollection("words").update({ word: { $in: ["nico10", "nico11", "nico12"] } }, { $inc: { nbHits: 1 } }, { multi: 1, upsert: 1 })

它将正确更新数据库中已经存在的密钥,但不插入丢失的密钥

这是预期的行为吗,有什么方法可以向mongoDB提供一个数组,以便它更新现有元素并创建需要创建的元素?

1 个答案:

答案 0 :(得分:1)

根据documentation,这是预期的行为:

  

此更新根据以下内容中的等式子句创建基础文档    参数,然后应用来自    参数。比较操作将不会   包含在新文档中。

而且,没有,没有办法使用简单的upsert实现您要在此处进行的操作。其原因可能是无法定义预期的结果。在您的特定情况下,可能会这样争论:“哦,很明显,我们应该在这里做些什么”。但是,想象一个更复杂的查询,像这样:

db.getCollection("words").update({
    a: { $in: ["b", "c" ] },
    x: { $in: [ "y", "z" ]}
},
{ $inc: { nbHits: 1 } },
{ multi: 1, upsert: 1 })

在这种情况下,MongoDB应该做什么?

但是,MongoDB中存在bulk write operations的概念,您需要定义三个单独的updateOne操作并将它们打包到服务器的单个请求中。