2016-12-29 21 views
0

У меня есть данные, хранящиеся в моем db.данные о массовом обновлении в mongodb

[ 
    { 
     date:'1-1-2016', 
     users:[ 
      { 
       'name':'james', 
       'age':18 
      }, 
      { 
       'name':'alice', 
       'age':20 
      } 
     ] 
    }, 
    { 
     date:'2-1-2016', 
     users:[ 
      { 
       'name':'james', 
       'age':18 
      }, 
      { 
       'name':'alice', 
       'age':20 
      }, 
      { 
       'name':'xiaomi', 
       'age':29 
      } 
     ] 
    } 
] 

У меня есть проблема с массовым обновлением массива объекта эффективно.

Мое начальное решение обновить на одной коллекции

Users.update({date:'1-1-2016','user.name':'james'},{'$set':'users.$.age':5}}) 

Так это обновит возраст Джеймсе до 5 из 18, база по дате и имени пользователя.

Но как увеличить объем обновления, говорит диапазон дат? использовать цикл с указанным выше запросом? Я думаю, что это неэффективно. Нужно руководствоваться.

ответ

2

Вы можете использовать $gte/$gt и $lte/$lt, чтобы соответствовать диапазону дат:

db.users.update({ 
    date: { 
     $gte: '1-1-2016', 
     $lt: '31-1-2016' 
    }, 
    'users.name': 'james' 
}, { '$set': { 'users.$.age': 10 } }, { 'multi': true }) 

к объемному обновлению со многой парой условий имени/возраста:

var data = [{ "name": "james", "age": 10 }, { "name": "alice", "age": 11 }]; 

var query = []; 

for (var i = 0; i < data.length; i++) { 

    query.push({ 
     updateMany: { 
      "filter": { 
       date: { 
        $gte: '1-1-2016', 
        $lt: '31-1-2016' 
       }, 
       'users.name': data[i].name 
      }, 
      "update": { '$set': { 'users.$.age': data[i].age } } 
     } 
    }) 
} 

db.users.bulkWrite(query); 
+0

что, если на 1- 1-2016 Я хочу установить возраст 10 на james и 2-1-2016 Я хочу установить возраст до 11 на james и так далее? Это не дата, извините, я пропустил интерпретацию. Это массовые обновления данных за несколько разных дат. –

+0

Я обновил с помощью 'bulkWrite' для выполнения нескольких' updateMany' на основе динамического имени конфигурации/возраста –

+0

, это именно то, что я сделал ранее. Но у вашей логики есть недостаток, что, если пользователь выбрал 1-1-2016, 4-1-2016 и 1-2-2016? –

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