MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB актуализира всички полета за грешка в масива

РЕДАКТИРАНЕ

Подробностите, които липсваха във въпроса, бяха, че задължителното поле за актуализиране всъщност е в поддокумент . Това значително променя отговора:

Това е ограничение на това, което можете да евентуално направете с актуализиране на елементите на масива. И това е ясно обяснено в документацията . Най-вече в този параграф:

Така че това е нещото. Опитвам се да актуализирам всички от елементите на масива в едно изявление като това няма работа. За да направите това, трябва да направите следното.

db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
    doc.items.forEach(function(item) {
        item.qty = 0;
    });
    db.warehouses.update({ "_id": doc._id }, doc );
})

Което всъщност е начинът за актуализиране навсеки елемент от масив.

Мултината настройка в .update() означава в множество "документи". Неможе да се прилага към множество елементи от масив. Така че в момента най-добрият вариант е да смените цялото нещо. Или в този случай можем също така да заменимцелия документ, тъй като така или иначе трябва да направим това.

Застивен групови данни, използвайте db.eval() . Но моля, прочетете първо документацията:

db.eval(function() {
    db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
        doc.items.forEach(function(item) {
            item.qty = 0;
        });
        db.warehouses.update({ "_id": doc._id }, doc );
    });
})

Актуализиравсички елементите в масив през цялото събирането не е просто.

Оригинал

Почти точно това, което казва грешката. За да използвате позиционен оператор, трябва да свържете нещо първо. Както в:

db.warehouses.update(
    // query 
    {
        _id:ObjectId('5322f07e139cdd7e31178b78'),
        "items.qty": { "$gt": 0 }
    },    
    // update 
    {
        $set:{"items.$.qty":0}
    },    
    // options 
    {
        "multi" : true,  
        "upsert" : true  
    }
);

И така, къде е съвпадението състояние перки на позицията от елементите, които са по-малко от 0 след това този индекс се предава на позиционния оператор.

P.S :При смути е вярно това означава, че се актуализира всеки документ. Оставете го false ако имате предвид само един . Което е по подразбиране.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да попълним поддокумент в mongoose след създаването му?

  2. Съхранявайте файла в GridFS на Mongo с ExpressJS след качване

  3. Mongodb събира, групира и брои екземпляри

  4. Mongoose създава празни масиви?

  5. Как да копирате колекция от една база данни в друга в MongoDB