この質問が以前に尋ねられたことは知っていますが、それは別のシナリオです。次のようなコレクションが欲しいです。
{
"_id" : ObjectId("4c28f62cbf8544c60506f11d"),
"pk": 1,
"forums": [{
"pk": 1,
"thread_count": 10,
"post_count": 20,
}, {
"pk": 2,
"thread_count": 5,
"post_count": 24,
}]
}
私がやりたいのは、「フォーラム」アイテムをアップサートし、カウンターをインクリメントするか、アイテムが存在しない場合は追加することです。
たとえば、次のようなことを行います (意味があることを願っています)。
db.mycollection.update({
"pk": 3,
"forums.pk": 2
}, {
"$inc": {"forums.$.thread_count": 1},
"$inc": {"forums.$.post_count": 1},
}, true)
そして持っています:
{
"_id" : ObjectId("4c28f62cbf8544c60506f11d"),
"pk": 1,
"forums": [{
"pk": 1,
"thread_count": 10,
"post_count": 20,
}, {
"pk": 2,
"thread_count": 5,
"post_count": 24,
}]
},
{
"_id" : ObjectId("4c28f62cbf8544c60506f11e"),
"pk": 3,
"forums": [{
"pk": 2,
"thread_count": 1,
"post_count": 1,
}]
}
私は確かに3つのステップでそれを作ることができます:
- コレクション全体を新しいアイテムでアップサートする
- addToフォーラム項目をリストに設定する
- 位置演算子を使用してフォーラム アイテム カウンターをインクリメントする
つまり、次のようになります。
db.mycollection.update({pk:3}, {pk:3}, true)
db.mycollection.update({pk:3}, {$addToSet: {forums: {pk:2}}})
db.mycollection.update({pk:3, 'forums.pk': 2}, {$inc: {'forums.$.thread_counter': 1, {'forums.$.post_counter': 1}})
それを行うより効率的な方法を知っていますか?TIA、ジェルマーノ