我偶然发现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提供一个数组,以便它更新现有元素并创建需要创建的元素?
答案 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操作并将它们打包到服务器的单个请求中。