アイテムの配列内のフィールドが存在する場合はそれをインクリメントするマングースクエリ、それ以外の場合はドキュメントに追加します(このタイトルの表現に苦労しています)

タイラーコルベック

私はこの質問を表現するのに苦労しています。それが、すでに投稿されている解決策が見つからない理由かもしれません。

mongooseとNodeJSを使用してmongoDBコレクションにクエリを実行しています。

クエリしているリストコレクションの構造は次のようになります。


    _id: ObjectId("1"),
    listName: "List 1",
    items: [
        {
           productId: ObjectId("11"),
           quantity: 2
        }
    ]

    _id: ObjectId("2"),
    listName: "List 2",
    items: [
        {
           productId: ObjectId("22"),
           quantity: 4
        }
    ]


リストIDの配列を使用してリストコレクションをクエリしたいと思います。クエリには、次のようなproductInfoフィールドも含まれています。

   listIdsToQuery: [ObjectId("1"), ObjectId("2)],
   productInfo: {
       productId: ObjectId("11"),
       quantity: 2
   }

productIdがまだリストのいずれかに含まれていない場合は、商品をitems配列に追加するだけです。これは簡単な部分であり、私はそれを理解しています。

私が行き詰まっているのは、製品がすでにリストにある場合、私が伝えている数量で製品の現在の数量をインクリメントしたいだけです。

したがって、上記の例では、次のようになります。

  • リスト1のitems配列にはすでに商品が含まれているため、その数量を2ずつ増やします。

  • リスト2は、items配列に製品がまだ含まれていないため、items配列にプッシュされるだけです。

    結果は次のようになります。


    _id: ObjectId("1"),
    listName: "List 1",
    items: [
        {
           productId: ObjectId("11"),
           quantity: 4
        }
    ]

    _id: ObjectId("2"),
    listName: "List 2",
    items: [
        {
           productId: ObjectId("22"),
           quantity: 4
        },
        {
           productId: ObjectId("22"),
           quantity: 4
        }
    ]

これが理にかなっていることを願っています。私が言ったように、私は良いグーグル検索の言葉遣いを思い付くのに苦労しています。

編集:今のところ、次のオプションはIDでリストを検索し、それらを変更してから、バックエンドのコレクションに更新をプッシュすることだと考えています。これは効率的な実行可能なオプションのように見えますか?

ウィリス

updateあなたが説明している方法を実行する方法があるかどうかはわかりませんが、これを解決する1つの方法は、productIdsproductCountsを2つの別々のフィールドに分割して、$addToSetand$inc演算子を使用し操作を実行できるようにすることです{ $addToSet: { productIds: ObjectId("22") }, $inc: { ["productCounts.22"]: 1 } }

更新の例を次に示します。

> db.test_coll.findOneAndUpdate({a: 1}, { $addToSet: { productIds: "22" }, $inc: { ["productCounts.22"]: 1 } }, {returnNewDocument: true});
{
    "_id" : ObjectId("5c6b6714f5b3e45884d12630"),
    "a" : 1,
    "productCounts" : {
        "22" : 4
    },
    "productIds" : [
        "22"
    ]
}
> db.test_coll.findOneAndUpdate({a: 1}, { $addToSet: { productIds: "23" }, $inc: { ["productCounts.23"]: 1 } }, {returnNewDocument: true});
{
    "_id" : ObjectId("5c6b6714f5b3e45884d12630"),
    "a" : 1,
    "productCounts" : {
        "22" : 4,
        "23" : 1
    },
    "productIds" : [
        "22",
        "23"
    ]
}
> 

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ