2016-12-02 3 views
0

Учитывая совокупность пользователей:MongoDB: добавить атрибут поддокумента

db.users.insertMany(
[ 
{ 
    _id: 1, 
    name: "sue", 
    points: [ 
     { points: 85, bonus: 20 }, 
     { points: 85, bonus: 10 } 
    ] 
}, 
{ 
    _id: 2, 
    name: "bob", 
    points: [ 
     { points: 85, bonus: 20 }, 
     { points: 64, bonus: 12 } 
    ] 
}]); 

Как добавить атрибут bonus_raw в каждом points, с копией значения bonus значения? Я пробовал:

db.getCollection('users').update({ }, 
    {$set:{ 'points.$.bonus_raw' : 'points.$.bonus' }}, false, true) 

, но я получаю:

Позиционный оператор не нашел матч, необходимый из запроса. Unexpanded update: points. $. Bonus_raw

ответ

1

Обновление нескольких элементов в массиве на данный момент невозможно в MongoDB.

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

В вашем случае, это может помочь: -

db.users.find({points: { $exists: true } }).forEach(function (doc){ 
    doc.points.forEach(function (points) { 
     points.bonus_raw = points.bonus; 
    }); 
    db.users.save(doc) 
}); 

Кроме того, позаботьтесь о гоночных условиях при выполнении обновления на этом пути. See this

Смежные вопросы