71

私はこのように構成されたドキュメントを持っています:

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

埋め込まれたオブジェクトの配列の$set2番目の要素を配列に含めることはできますか?itemsherosnickname "test"

結果:

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

4 に答える 4

144

2つの概念を利用する必要があります。mongodbの位置演算子と、更新するエントリの数値インデックスを使用することです。

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

{"heroes.nickname": "test"}

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

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

「items」の2番目の配列エントリを更新する必要があるため、配列キーには0のインデックスが付けられます。これが、キー1です。

それで:

> db.denis.insert({_id:"43434", heroes : [{ nickname : "test",  items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]});
> db.denis.update(
    {"heroes.nickname": "test"}, 
    {$set: {
        "heroes.$.items.1": "new_value"
    }}
)
> db.denis.find()
{
    "_id" : "43434", 
    "heroes" : [
        {"nickname" : "test", "items" : ["", "new_value", "" ]},
        {"nickname" : "test2", "items" : ["", "", "" ]}
    ]
}
于 2012-05-03T14:03:16.997 に答える
3

位置$を使用して配列内のドキュメントを更新してみてください。

位置$演算子は、埋め込まれたドキュメントを含む配列の更新を容易にします。位置$演算子を使用して、$演算子にドット表記を付けて埋め込みドキュメントのフィールドにアクセスします。

db.collection.update(
  { "heroes.nickname": "test" },
  { $set: { "heroes.$.items.1": "new_value" } },
  { multi: true }
);

遊び場

于 2021-04-23T10:36:13.023 に答える
1

位置$と$positionで更新してみてください。

db.collection.update(
  { heroes:{ $elemMatch:{ "nickname" : "test"} } },
  {
    $push: {
      'heroes.$.items': {
        $each: ["new_value" ],
        $position: 1
      }
    }
  }
)
于 2018-10-11T13:27:14.993 に答える
1

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

{
  _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)
于 2019-04-17T04:44:28.917 に答える