Вы не можете обновить два документа с двумя разными значениями, вам нужно будет запустить их как два отдельных обновления.
Вы не хотите помещать данные в свои ключевые значения, лучше оставить их как есть. Нет хорошего способа сопоставить значения ключей вне $exists, и даже это не поддерживает подстановочные знаки. Таким образом, вам нужно будет получить 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 } ] }
person
Mason
schedule
21.08.2013