2013-06-25 47 views
2

我想一个蒙戈集合,其中有可能是同一集合内的多个比赛中更新多个子文档。不幸的是,它只是更新每个文档中匹配的第一个子文档。多子文档更新

下面是代码:

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