2013-06-25 2 views
2

Я пытаюсь обновить несколько поддокументов внутри коллекции Mongo, где может быть несколько совпадений внутри одной коллекции. К сожалению, он обновляет только первый поддокумент в каждом документе, который имеет совпадение.Обновление нескольких поддокументов в массивах subdocument Mongo

Вот код:

var mongoose = require('mongoose'); 

mongoose.connect('mongodb://127.0.0.1/touchbits'); 

var PartsSchema = new mongoose.Schema({ 
     type: String 
     , partNbr: Number 
    }); 

var ProductSchema = new mongoose.Schema({ 
     sku: { type: String, unique: true } 
     , parts: [PartsSchema] 
    }); 

Product = mongoose.model('Product', ProductSchema); 

var cigars = new Product({ 
     sku: 'cigar123', 
     parts: [{type: 'tobacco', partNbr: 4}, 
       {type: 'rolling paper', partNbr: 8}, 
       {type: 'tobacco', partNbr: 4}] 
    }); 
var cigarillo = new Product({ 
     sku: 'cigarillo456', 
     parts: [{type: 'tobacco', partNbr: 4}, 
       {type: 'crush paper', partNbr: 12}] 
    }); 

cigars.save(function(err, product1) { 
     if(err) { console.log("err1: " + err); return err; } 
     console.log("saved: " + product1); 
     cigarillo.save(function(err, product2) { 
       if(err){ console.log("err2: " + err); return err; } 
       console.log("saved: " + product2); 
       Product.update({ "parts.type": 'tobacco' }, 
           { $set: { "parts.$.partNbr": 5 } }, 
           { multi: true }, 
           function(err, numAffected) { 
            if (err) { console.log("err3: " + err); return err; } 
            console.log("records updated: " + numAffected); 
            Product.find({}, function(err, docs) { 
              if (err) { console.log("err4: " + err); return err; } 
              console.log("updated data: " + docs); 
              Product.remove(function(err) { 
                if (err) { console.log("err5: " + err); return err; } 
                process.exit(); 
               }); 
             }); 
           }); 
      }); 
    }); 

Тогда, когда я запускаю его, я получаю следующие результаты:

saved: { __v: 0, 
    sku: 'cigar123', 
    _id: 51c9229b7fe80ef71e000002, 
    parts: 
    [ { type: 'tobacco', partNbr: 4, _id: 51c9229b7fe80ef71e000005 }, 
    { type: 'rolling paper', 
     partNbr: 8, 
     _id: 51c9229b7fe80ef71e000004 }, 
    { type: 'tobacco', partNbr: 4, _id: 51c9229b7fe80ef71e000003 } ] } 
saved: { __v: 0, 
    sku: 'cigarillo456', 
    _id: 51c9229b7fe80ef71e000006, 
    parts: 
    [ { type: 'tobacco', partNbr: 4, _id: 51c9229b7fe80ef71e000008 }, 
    { type: 'crush paper', 
     partNbr: 12, 
     _id: 51c9229b7fe80ef71e000007 } ] } 
records updated: 2 
updated data: { sku: 'cigar123', 
    _id: 51c9229b7fe80ef71e000002, 
    __v: 0, 
    parts: 
    [ { type: 'tobacco', partNbr: 5, _id: 51c9229b7fe80ef71e000005 }, 
    { type: 'rolling paper', 
     partNbr: 8, 
     _id: 51c9229b7fe80ef71e000004 }, 
    { type: 'tobacco', partNbr: 4, _id: 51c9229b7fe80ef71e000003 } ] },{ sku: 'cigarillo456', 
    _id: 51c9229b7fe80ef71e000006, 
    __v: 0, 
    parts: 
    [ { type: 'tobacco', partNbr: 5, _id: 51c9229b7fe80ef71e000008 }, 
    { type: 'crush paper', 
     partNbr: 12, 
     _id: 51c9229b7fe80ef71e000007 } ] } 

Обратите внимание, что второй «табак» запись в документе «сигарами» до сих пор имеет PartNbr из 4 вместо 5. Кто-нибудь знает, как изменить обновление, чтобы обновить все поддокументы в массиве, которые соответствуют условию запроса?

ответ

5

Функция обновления нескольких поддокументов в рамках одного такого запроса еще не реализована.

имеет текущий запрос на https://jira.mongodb.org/browse/SERVER-1243

+0

Спасибо за ссылку. IYO - лучшее решение для продолжения обновления документа до тех пор, пока не будет обновлено больше записей? – frank

+0

Если вы не можете изменить структуру схемы или не хотите вытащить весь документ из Mongo и обновить в своем приложении, а затем отбросить назад; то это сработает. – daveh