1

我对此进行了一些研究,并没有遇到任何像我正在寻找的东西那样立即跳出来的东西。

假设我们在一个集合中有一个(或多个)文档,看起来像这样:

//First example document
{
  "_id": "JK",
  "letters": ["J", "K"]
}
//Second example document
{
  "_id": "LM",
  "letters": ["L"]
}

所以我运行如下查询,看看我是否有任何匹配的文档,当然我没有,所以我希望得到空值。

> db.example.findOne({"_id": "LM", "letters": {"$in": ["M"]}})
null

因此,我进行了更新并将“M”添加到文档的字母数组中(语法可能不太正确):

> db.example.update({"_id": "LM"}, {"$addToSet": {"letters": "M"}})

我可能没有匹配的 _id,因此 findOne 也会返回 null 给定此查询集合中的示例文档。

> db.example.findOne({"_id": "AB", "letters": {"$in": ["A"]}})
null

根据我构建上述查询的方式,当在字母中找不到“A”或在任何文档中找不到“AB”的_id时,我会返回 null。在这种情况下,我知道该文档不在其中,因为我知道集合中有什么。

我想要做的是使用 $addToSet 从上面保留我的更新查询并修改它以使用 upsert 同时指定要插入的文档,以防 $addToSet 由于文档不存在而失败以减少数据库事务。这可能吗?还是我必须稍微分解一下我的查询才能适应这个?

因为这些信息可能会影响答案:我通过 mongo shell 和 pymongo 进行查询。

蒙戈版本:2.6.11

pymongo 版本:2.8

谢谢你的帮助!

编辑:所以在休息和更多挖掘之后,似乎 setOnInsert 做了我想要的。我确实相信这可能会解决我的问题,但我还没有机会进行测试。

4

0 回答 0