2017-01-30 2 views
1

Мне нужна помощь. Мне нужно обновить все документы из коллекций, но значение differnt согласно условию с использованием MongoDB. Я объясняю свою коллекцию ниже.Запрос на обновление всех документов из коллекций по ключевому значению с использованием MongoDB

db_users:

{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "device_type" : "Android" }, 
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541b"), "device_type" : " " } 

Здесь мне нужно добавить один дополнительный столбец (i.e-version) для каждого документа, а также обновить version=1.0 когда "device_type": "Android" и version='' когда "device_type": "". Мне нужен запрос для этого. Пожалуйста, помогите мне.

ответ

2

Я думаю, что не может быть один запрос, чтобы сделать два типа операции, но не может быть два запроса

db.db_users.update({'device_type':"Android"},{$set : {'version':"1.0"}},{multi:true}); 
db.db_users.update({'device_type':""},{$set : {'version':""}},{multi:true}); 

также в документе показывает пустое место «», тогда как в вопросе вы упомянули Это "". если он несовместим, вы должны использовать пользователя $ или.

Она также может быть сделано с помощью одного сценария

db.db_users.find().forEach(function(doc){if(doc.device_type && doc.device_type==='Android'){doc.version="1.0"}else{doc.version=""} db.db_users.save(doc)}); 

, если есть несколько логики, то лучше пойти на сценарий, если он ограничивается, как вы упомянули в своем вопросе два обновления была бы предпочтительнее.

0

Для MongoDB 3.4 и новее:

Использование механизма агрегации, трубопровод $addFields и $out обновит свою коллекцию с одной совокупной операции. Например:

db.users.aggregate([ 
    { 
     "$addFields": { 
      "version": { 
       "$switch": { 
        "branches": [ 
         { "case": { "$eq": ["$device_type", "Android"] }, "then": "1.0" }, 
         { "case": { "$eq": ["$device_type", " "] }, "then": "" } 
        ] 
       } 
      } 
     } 
    }, 
    { "$out": "users" } 
]) 

Для MongoDB 3.2:

Вы можете использовать bulkWrite методы для более быстрого и эффективного обновления. Рассмотрим следующую операцию:

var ops = []; 
db.users.aggregate([ 
    { 
     "$project": { 
      "version": { 
       "$cond": [ 
        { "$eq": ["$device_type", "Android"] }, 
        "1.0", 
        "" 
       ] 
      } 
     } 
    } 
]).forEach(function(doc){ 
    ops.push({ 
     "updateOne": { 
      "filter": { "_id": doc._id }, 
      "update": { "$set": { "version": doc.version } } 
     } 
    }); 
    if (ops.length === 500) { 
     // Execute per 500 operations and re-initialise 
     db.users.bulkWrite(ops); 
     ops = []; 
    } 
}) 

if (ops.length > 0) { 
    db.users.bulkWrite(ops); 
} 

Для MongoDB < = 3,0 и> = 2.6:

var bulk = db.users.initializeUnorderedBulkOp(); 
var count = 0; 

db.users.aggregate([ 
    { 
     "$project": { 
      "version": { 
       "$cond": [ 
        { "$eq": ["$device_type", "Android"] }, 
        "1.0", 
        "" 
       ] 
      } 
     } 
    } 
]).forEach(function(doc) { 
    bulk.find({ "_id": doc._id }).updateOne({ "$set": { "version": doc.version } }); 
    count++; 
    if (count % 500 === 0) { 
     // Excecute per 500 operations and re-initialise 
     bulk.execute(); 
     bulk = db.users.initializeUnorderedBulkOp(); 
    } 
}) 

// clean up remaining operations in queue 
if (count > 0) { 
    bulk.execute(); 
} 
Смежные вопросы