2

同じコレクション内に複数の一致がある可能性がある 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 } ] }

「cigars」ドキュメントの 2 番目の「tobacco」レコードの PartNbr は 5 ではなく 4 のままであることに注意してください。クエリ条件に一致する配列内のすべてのサブドキュメントを更新するように更新を変更する方法を知っている人はいますか?

4

1 に答える 1

5

このような 1 つのリクエスト内で複数のサブドキュメントを更新する機能はまだ実装されていません。

https://jira.mongodb.org/browse/SERVER-1243に現在のリクエストがあります

于 2013-06-25T05:25:00.303 に答える