[arrays] MongoDB : 배열 내의 인덱스가 참조하는 배열의 단일 하위 요소를 어떻게 업데이트합니까?

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에서 이러한 종류의 업데이트를 수행하는 방법에 대한 명확한 설명을 찾을 수 없습니다.



답변

예상대로 방법을 알면 쿼리가 쉽습니다. 다음은 파이썬의 구문입니다.

db["my_collection"].update(
    { "_id": ObjectId(document_id) },
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)


답변

Mongo Shell에서 인덱스 (예 : 1)가 참조하는 배열 요소의 업데이트는 인덱스 값을 직접 표시하여 수행 할 수도 있습니다.

db.my_collection.update(
    {_id : "document_id"},
    {$set : {"my_array.1.content" : "New content B"}}
)


답변

몽고 스타일에서 ‘$’위치 연산자를 사용합니다. 자세한 내용은 이 링크 를 확인 하십시오.

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


답변

db.my_collection.update(
  {_id: ObjectId(document_id), my_array : { ... old content A ... } },
  { $set: { "my_array.$.content" : "NEW content B" } }
)


답변

실제 인덱스인지 모르지만 요소고유 식별자가 있는 배열 요소를 업데이트해야하는 경우 :

// 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"은 배열 요소의 고유 식별자입니다.


답변

예를 들어 이전 콘텐츠 B 의 키 가 “value” 인 경우 배열의 요소 인덱스를 전달하는 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"}})


답변

백틱을 사용하여 Javascript에서 수행하는 깔끔한 방법은 다음과 같습니다.

 const index = 1;

 ...  {   $set: { [`myArray.${index}.value`]: "new content"}  },  ...