私はこれについて少し調査しましたが、私が探しているものとしてすぐに飛び出すものは何も見つかりませんでした.
コレクションに次のようなドキュメント (または複数のドキュメント) があるとします。
//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
そこで、更新を行い、ドキュメントの文字配列に「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 で保持し、データベース トランザクションを削減するためにドキュメントが存在しないために $addToSet が失敗した場合に挿入するドキュメントを指定しながら upsert を使用するように変更することです。これは可能ですか?または、これに対応するためにクエリを少し分割する必要がありますか?
この情報は回答に影響を与える可能性があるため、mongo shell と pymongo を使用してクエリを実行します。
モンゴのバージョン: 2.6.11
ピモンゴのバージョン: 2.8
助けてくれてありがとう!
編集:休憩ともう少し掘り下げた後、 setOnInsert は私が探していたものを実行しているようです。これでおそらく問題は解決すると思いますが、まだテストする機会がありません。