2013-06-25 5 views
2

동일한 컬렉션 내에 여러 일치가있을 수있는 Mongo 컬렉션 내의 여러 하위 문서를 업데이트하려고합니다. 아쉽게도 각 문서 내의 첫 번째 하위 문서 만 일치하는 업데이트하고 있습니다. 나는 그것을 실행할 때, 나는 다음과 같은 결과를 얻을 그리고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