Как мне обновить 2 определенных элемента в массиве с 2 различными значениями?

У меня есть документ такого рода:

{ _id:ObjectID, list:Array }

И список содержит элементы формы (которые я буду называть listElement):

{ _id:ObjectID, time:Number }

Я хочу обновить подполе времени двух конкретных элементов списка, каждое из которых имеет свое собственное значение. У меня есть доступ к обоим _id из списка элементов.

Связанное с этой проблемой: было бы лучше преобразовать список из Array в Object, ключи которого являются значениями _id? поэтому я хотел бы сделать db.update( ( _id:"Идентификатор документа" }, { "list.423rfasf2q3.time":200, "list.fjsdhfksjdh2432.time":100 })?

Я не уверен, как можно использовать ObjectID в качестве ключа, но я предполагаю, что я могу просто завести его и иметь значение _id и ключ, содержащий этот listElement, в одной строке.

1 ответ

Решение

Вы не можете обновить два документа с двумя разными значениями, вам нужно запустить его как два отдельных обновления.

Вы не хотите помещать данные в ключевые значения, лучше оставить их как есть. Нет хорошего способа сопоставления значений ключей за пределами $, и даже это не поддерживает подстановочные знаки. Таким образом, вам нужно получить ObjectId, преобразовать его в строку, объединить его в ключ, а затем запросить документы, в которых этот ключ существует. Гораздо проще просто поместить значение в документе в массив. Кроме того, нет способа индексировать значения ключей в MongoDB, поэтому, если вы хотите проиндексировать свои данные, вам нужно иметь их в массиве как элемент данных.

Изменить, чтобы включить пример позиционного соответствия

Сначала вставьте два документа

> db.test.insert( {list: [ {_id: new ObjectId(), time: 1234}, {_id: new ObjectId(), time: 4556} ] } )
>

Продемонстрировать, что они оба там

> db.test.find()
{ "_id" : ObjectId("5215036749177daf439a2ffe"), "list" : [{ "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 }, { "_id" :
ObjectId("5215036749177daf439a2ffd"), "time" : 4556 } ] }
>

Покажите, что если мы сделаем обычный фильтр массива, мы получим все элементы массива

> db.test.find({"list._id":ObjectId("5215036749177daf439a2ffc")})
{ "_id" : ObjectId("5215036749177daf439a2ffe"), "list" : [ { "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 }, { "_id" :
ObjectId("5215036749177daf439a2ffd"), "time" : 4556 } ] }
>

Продемонстрировать, что мы можем использовать $ оператор, чтобы вернуть только первый элемент массива, который был сопоставлен

> db.test.find({"list._id":ObjectId("5215036749177daf439a2ffc")}, {_id: 0, "list.$": 1})
{ "list" : [ { "_id" : ObjectId("5215036749177daf439a2ffc"), "time" : 1234 } ] }
Другие вопросы по тегам