web-dev-qa-db-ja.com

MongoDBの正確な要素配列のフィールドを更新する

次のような構造のドキュメントがあります。

{
    _id:"43434",
    heroes : [
        { nickname : "test",  items : ["", "", ""] },
        { nickname : "test2", items : ["", "", ""] },
    ]
}

items$setを持つ配列herosの埋め込みオブジェクトのnickname配列の2番目の要素を"test"できますか?

結果:

{
    _id:"43434",
    heroes : [
        { nickname : "test",  items : ["", "new_value", ""] }, // modified here
        { nickname : "test2", items : ["", "", ""] },
    ]
}
61
Denis Ermolin

次の2つの概念を使用する必要があります。 mongodbの定位置演算子 および更新するエントリの数値インデックスを使用するだけです。

位置演算子を使用すると、次のような条件を使用できます。

{"heros.nickname": "test"}

次に、見つかった配列エントリを次のように参照します。

{"heros.$  // <- the dollar represents the first matching array key index

"items"の2番目の配列エントリを更新したいので、配列キーには0のインデックスが付けられます-これがキー1です。

そう:

> db.denis.insert({_id:"43434", heros : [{ nickname : "test",  items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]});
> db.denis.update(
    {"heros.nickname": "test"}, 
    {$set: {
        "heros.$.items.1": "new_value"
    }}
)
> db.denis.find()
{
    "_id" : "43434", 
    "heros" : [
        {"nickname" : "test", "items" : ["", "new_value", "" ]},
        {"nickname" : "test2", "items" : ["", "", "" ]}
    ]
}
125
AD7six

このソリューションはうまく機能します。ポイントを1つ追加するだけです。これがその構造です。 OrderItemIdが「yyy」であることを確認し、更新する必要があります。条件のクエリフィールドが配列の場合、以下のように「OrderItems.OrderItemId」は配列です。クエリの操作として「OrderItems.OrderItemId [0]」を使用することはできません。代わりに、「OrderItems.OrderItemId」を使用して比較する必要があります。それ以外の場合は、一致できません。

{
  _id: 'orderid',
  OrderItems: [
   {
     OrderItemId: ['xxxx'], 
    ... },
   {
     OrderItemId: ['yyyy'], 
    ...}, 
]

}
 result =  await collection.updateOne(
        { _id: orderId, "OrderItems.OrderItemId": [orderItemId] },
        { $set: { "OrderItems.$.imgUrl": imgUrl[0], "OrderItems.$.category": category } },
        { upsert: false },
      )
    console.log('  (result.modifiedCount) ', result.modifiedCount)
    console.log('  (result.matchedCount) ', result.matchedCount)
0
Kathy
db.collection.update(
{
heroes:{$elemMatch:{ "nickname" : "test"}}},
 {
     $Push: {
        'heroes.$.items': {
           $each: ["new_value" ],
           $position: 1
        }
     }
   }

)
0
Rubin Porwal