MongoDB: Як мені оновити один піделемент у масиві, на який посилається індекс у масиві?


84

Я намагаюся оновити один піделемент, що міститься в масиві в документі 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.

Відповіді:


76

Як і слід було очікувати, запит стає простим, коли ви знаєте, як це зробити. Ось синтаксис у python:

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

13
де це задокументовано?
ROROROOROROR

Це закінчується створенням однойменного об’єкта замість оновлення масиву
Kisinga

Це, безумовно, застаріла відповідь.
Mark Odey

49

Оновлення елемента масиву, на який посилається індекс (наприклад, 1) у Mongo Shell, також може бути здійснено шляхом прямого вказівки значення індексу:

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

Як нам це зробити, якщо ми не знаємо індексу?
Мухаммед Шахзад,


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

5

Коли потрібно оновити елемент масиву, не знаючи його фактичного індексу, але маючи унікальний ідентифікатор елемента:

// 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"унікальний ідентифікатор елемента масиву.


У оболонці Mongo з findAndModify подвійні лапки в $setмені не працюють. Я повинен використовувати одинарні лапки для поля.
WesternGun

4

Ви можете використовувати функцію updateOne mongoDB, передаючи індекс елемента в масиві, якщо ключ старого вмісту B - "значення" для прикладу:

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

команда повинна бути такою:

db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})

5
Як нам це зробити, якщо ми не знаємо індексу?
Шахар'яр Кірмані

3

Акуратним способом зробити це в Javascript, із зворотними позначками, є:

 const index = 1;

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

1

Коли потрібно оновити елемент масиву, не знаючи, що це фактичний індекс, але маючи унікальний ідентифікатор елемента

db.getCollection('profiles').update(
  {
    'userId':'4360a380-1540-45d9-b902-200f2d346263',
    'skills.name':'css'
  },
  {
      $set: {'skills.$.proficiencyLevel': 5}
  }, 
  {
      multi: true
  }
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.