編集:これは実際に機能していました
Mongoose - Subdocs: "Adding subdocs"ドキュメントにあるように、メソッドを使用してサブドキュメントを追加できます(push
つまりparent.children.push({ name: 'Liesl' });
)
$push
しかし、さらに進んで、演算子を使用してサブドキュメントを挿入したいと考えています。
私は2つのスキーマを持っていますThingSchema
:
var ThingSchema = mongoose.Schema({
name: {
type: String,
required: true
},
description: {
type: String
}
});
と、次のサブドキュメント ( ) のBoxSchema
配列を持つメイン ドキュメント:things
ThingSchema
var BoxSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
description: {
type: String
},
things: {
type: [ThingSchema]
}
});
var BoxModel = mongoose.model('Box', BoxSchema);
すべてのサブドキュメントに名前things
を付ける必要があります。つまり、サブドキュメントに既に存在する値をunique
持つ新しいドキュメントをこの配列に挿入することは不可能です。name
私は次のようなことをしようとしています:
var thingObj = ... // the 'thing' object to be inserted
BoxModel.update({
_id: some_box_id, // a valid 'box' ObjectId
"things.name": { "$ne": thingObj.name }
},
{
$push: { things: thingObj}
},
function(err) {
if (err) // handle err
...
});
しかし、望ましい結果は得られません。
Mongoose Docsの方法ではなく、クエリで演算子を使用してThingSchema
サブドキュメントをBoxSchema
のthing
配列に追加する正しい方法は何ですか(同じ名前の別のサブドキュメントがある場合はサブドキュメントを追加しないでください) 。$push
編集:これは実際に問題です
私は間違いを犯しました。上記のコードは期待どおりに機能しますが、現在の問題は、 が とthingObj
一致しない場合、空のオブジェクトが配列ThingSchema
に挿入されることです。things
// now thingObj is trash
var thingObj = { some: "trash", more: "trash" };
上記のごみ箱オブジェクトを指定してクエリを実行すると、次の空のオブジェクトが subdocs 配列に挿入されます。
{ _id: ObjectId("an_obj_id") }
この場合、 が とthingObj
一致しない場合、ThingSchema
何も追加する必要はありません。