101

mongodbドキュメントの配列に含まれる単一のサブ要素を更新しようとしています。配列インデックスを使用してフィールドを参照したい(配列内の要素には、一意の識別子になることを保証できるフィールドがありません)。このように簡単にできるはずですが、構文がわかりません。

これが私がpseudo-jsonでやりたいことです。

前:

{
  _id : ...,
  other_stuff ... ,
  my_array : [
    { ... old content A ... },
    { ... old content B ... },
    { ... old content C ... }
  ]
}

後:

{
  _id : ...,
  other_stuff ... ,
  my_array : [
    { ... old content A ... },
    { ... NEW content B ... },
    { ... old content C ... }
  ]
}

クエリは次のようになります。

//pseudocode
db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  {my_array.$.content: NEW content B }
)

しかし、これは機能しません。私はmongodbドキュメントを検索し、この構文のさまざまなバリエーションを試してみるのに非常に長い時間を費やしました(たとえば、を使用$sliceするなど)。MongoDBでこの種の更新を実行する方法の明確な説明が見つかりません。

4

9 に答える 9

84

予想通り、方法がわかればクエリは簡単です。Pythonでの構文は次のとおりです。

db["my_collection"].update(
    { "_id": ObjectId(document_id) },
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)
于 2012-07-07T14:29:00.327 に答える
61

Mongo Shellのインデックス(例:1)によって参照される配列要素の更新は、インデックス値を直接指定することによっても実行できます。

db.my_collection.update(
    {_id : "document_id"},
    {$set : {"my_array.1.content" : "New content B"}}
)
于 2015-12-09T11:40:15.460 に答える
60

モンゴスタイルでは、「$」位置演算子を使用します。詳細については、このリンクを確認してください。

db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  { $set: { "my_array.$.content" : "NEW content B" } }
)
于 2015-05-05T17:03:38.157 に答える
24

実際のインデックスを知らずに配列要素を更新する必要があるが、要素の一意の識別子を持っている場合:

// Modify a comment in a bucket
db.POST_COMMENT.update(
    {
        "_id": ObjectId("5ec424a1ed1af85a50855964"),
        "bucket.commentId": "5eaf258bb80a1f03cd97a3ad_lepf4f"
    },
    {
        $set: {
            "bucket.$.text": "Comment text changed",
            "bucket.$.createdDate": ISODate("2015-12-11T14:12:00.000+0000")
        }
    }
)

"bucket.commentId"配列要素の一意の識別子は次のとおりです。

于 2020-05-20T17:20:33.347 に答える
9
db.my_collection.update(
  {_id: ObjectId(document_id), my_array : { ... old content A ... } },
  { $set: { "my_array.$.content" : "NEW content B" } }
)
于 2017-07-21T10:48:28.843 に答える
8

バックティックを使用してJavascriptでそれを行うためのきちんとした方法は、次のとおりです。

 const index = 1;

 ...  {   $set: { [`myArray.${index}.value`]: "new content"}  },  ...
于 2020-03-15T20:27:47.793 に答える
6

実際のインデックスであることがわからないが、要素の一意の識別子を持っている配列要素を更新する必要がある場合

db.getCollection('profiles').update(
  {
    'userId':'4360a380-1540-45d9-b902-200f2d346263',
    'skills.name':'css'
  },
  {
      $set: {'skills.$.proficiencyLevel': 5}
  }, 
  {
      multi: true
  }
)
于 2020-06-16T17:14:32.387 に答える
3

古いコンテンツBのキーが例のように「値」である場合、配列内の要素のインデックスを渡すmongoDBのupdateOne関数を使用できます。

[
...
"value" : "old content A"
"value" : "old content B"
"value" : "old content C"
...
]

コマンドは次のようになります。

db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})
于 2019-05-03T14:33:22.550 に答える
3

次のドキュメントから、_id =60c4918d74c30165ba585c14の紹介文のauthorNameを更新する場合:

"business": {
    "ownerId": "60a5ebad7432d91b853c0277",
    "testimonials": [
        {
            "_id": "60c4912877dd5664f2201b08",
            "authorName": "user1",
            "authorBio": "User from 10 years",
            "image": "user1/img1",
            "review": "asdfiuahsdfpoiuashdpfoaspdlfkjn;alsfpuoh"
        },
        {
            "_id": "60c4918d74c30165ba585c14",
            "authorName": "user2",
            "authorBio": "User from 3 years",
            "image": "user/img1",
            "review": "asdpfuahsfljnsadfoihsf."
        }
    ],
    "createdAt": "2021-06-11T20:12:56.666Z",
    "updatedAt": "2021-06-12T11:11:56.696Z",
    
}

次に、次のマングースクエリが機能します。

await BusinessModel.updateOne(
        {
            '_id': Mongoose.Types.ObjectId(businessId),
            'testimonials._id': Mongoose.Types.ObjectId('60c4918d74c30165ba585c14')
        },
        {
            $set: { 'testimonials.$.authorName' : 'new author name' } 
        }
    );

https://docs.mongodb.com/drivers/node/fundamentals/crud/write-operations/embedded-arrays/も参照してください

于 2021-06-12T11:19:25.367 に答える