我已经对此进行了一些研究,并且没有发现任何立即突然出现在我身上的东西。
假设我们在集合中有一个文档(或多个文档),如下所示:
//First example document
{
"_id": "JK",
"letters": ["J", "K"]
}
//Second example document
{
"_id": "LM",
"letters": ["L"]
}
所以我运行一个类似下面的查询来查看我是否有任何匹配的文档,当然我不会这样,所以我希望得到null。
> db.example.findOne({"_id": "LM", "letters": {"$in": ["M"]}})
null
所以我做了更新并添加了#34; M"到文档上的字母数组(语法可能不太正确):
> db.example.update({"_id": "LM"}, {"$addToSet": {"letters": "M"}})
我有可能没有匹配的_id,所以findOne也会在给定此查询的集合中的示例文档时返回null。
> db.example.findOne({"_id": "AB", "letters": {"$in": ["A"]}})
null
根据我构建上述查询的方式,当" A"没有在字母或_ 34; AB"的_id中找到在任何文件中都找不到。在这种情况下,我知道这个文件不在那里,因为我知道集合中的内容。
我想做的是使用$ addToSet从上面保留我的更新查询并修改它以使用upsert WHILE还指定要在$ addToSet由于文档不存在而失败的情况下插入的文档关于数据库事务。这可能吗?或者我是否需要稍微分解一下我的查询才能适应这种情况?
因为此信息可能会影响答案: 我通过mongo shell和pymongo进行查询。
mongo版本:2.6.11
pymongo版本:2.8
感谢您的帮助!
编辑:所以经过休息和更多的挖掘,似乎setOnInsert做我想要的。我相信这可能解决了我的问题,但我还没有机会进行测试。