0

マルチレベルのスキーマがあり、$演算子を使用して深いレベルのリストに要素を追加しようとしています。

私のスキーマは次のようになり、特定のcListにオブジェクトを追加しようとしています。

var cSchema = mongoose.Schema({c:String,
    cList[
       {
         d1:String
         d2:String   
       }
    ]
});

var bSchema = mongoose.Schema({c:String,
    b:String,
    bList:[cSchema]
});


var aSchema = mongoose.Schema({
    a:String,
    aList:[bSchema]
}); 

以下を実行しようとしましたが、countは常に0を返します。

Model.update( {_id:req.aid, "aList._id":req.params.bid, "bList.$.cList._id":req.params.cid}, 
              {'$addToSet' : {'aList.$.bList.$.cList': req.body}}, 
              function(err,count){

              }
);
4

1 に答える 1

5

$演算子は、クエリセレクター(最初の引数)updateではなく、更新演算子オブジェクト(の2番目の引数)で使用するためのものです。クエリセレクタでは、を使用できるはずaList.bList.cList._idです。これにより、更新演算子aList.$.bList.$.cListに埋め込まれているの最初の一致する要素に対応できるようになります。cList

編集:

ネストされた位置($)演算子のマッチングは、現在サポートされていません。このチケットは、昔(2010年!)からまさにこの機能に対する需要を示していますが、mongoDB内の低レベルのコードではこれが不可能だったようです。10genは、2.6リリースでこの機能を利用できるようになることを期待しているようです。

現在のスキーマでこれを実現するには、個別にクエリと更新を行う必要があるようです。または、スキーマをよりフラットに変更する必要があるかもしれません。

于 2013-02-01T18:19:59.243 に答える