編集:これは実際に機能していました
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配列を持つメイン ドキュメント:thingsThingSchema
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何も追加する必要はありません。