MongoDB new ObjectId по массиву дает мне одинаковый идентификатор для всех

Я пытаюсь обновить элементы в массиве с помощью уникальных ObjectIds (что означает добавление идентификатора объекта в объект массива, в котором они отсутствуют)

Если у меня есть массив объектов рубашки в моей коллекции, и я попробую это:

db.people.update({        
    $and : [
        _id: ObjectId('5eeb44c6a042791d28a8641f'),
        {
            $or: [
            { 'shirts._id': { $eq:null } },
            { 'shirts._id':{ $exists:false } }
            ]
        }           
    ]
},{ 
    $set: { 'shirts.$[]._id': new ObjectId() }
},{
    "multi" : true
}

);

Он генерирует ИДЕНТИЧНЫЕ ObjectsID для каждого элемента массива, я бы поставил для него уникальный индекс, однако вариант использования, вероятно, не увидит более 2-3 элементов в массиве с крайними случаями, достигающими 5-6, что похоже на злоупотребление индексом

Как я могу обновить несколько записей или несколько объектов массива с уникальным ObjectId?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
202
1

Ответы 1

Когда вы используете $set, вы говорите mongo установить это значение для всех совпадающих элементов. Если элементы в массиве уже определены как схемы, mongo автоматически выдаст новые ObjectIds для каждой из них.

В качестве альтернативы вы можете использовать forEach и перебирать каждый соответствующий элемент, создавая новый ObjectId.

Вы можете привести пример для каждого

j-p 15.01.2019 07:49

Зачем вы видите обновленный запрос? Mongo может автоматически заполнять _ids, если вы сообщите ему, что вложенные объекты являются схемами.

rlecaro2 15.01.2019 15:06

данные уже существуют - я хочу исправить - у этих объектов нет идентификаторов

j-p 15.01.2019 15:58

Этот ответ очень похож на stackoverflow.com/a/22657219/978697

rlecaro2 15.01.2019 16:54

Другие вопросы по теме