我对此进行了一些研究,并没有遇到任何像我正在寻找的东西那样立即跳出来的东西。
假设我们在一个集合中有一个(或多个)文档,看起来像这样:
//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 做了我想要的。我确实相信这可能会解决我的问题,但我还没有机会进行测试。