2

編集:これは実際に機能していました

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サブドキュメントをBoxSchemathing配列に追加する正しい方法は何ですか(同じ名前の別のサブドキュメントがある場合はサブドキュメントを追加しないでください) $push


編集:これは実際に問題です

私は間違いを犯しました。上記のコードは期待どおりに機能しますが、現在の問題は、 が とthingObj一致しない場合、空のオブジェクトが配列ThingSchemaに挿入されることです。things

// now thingObj is trash
var thingObj = { some: "trash", more: "trash" };

上記のごみ箱オブジェクトを指定してクエリを実行すると、次の空のオブジェクトが subdocs 配列に挿入されます。

{ _id: ObjectId("an_obj_id") }

この場合、 が とthingObj一致しない場合、ThingSchema何も追加する必要はありません。

4

1 に答える 1

1

$addToSet配列に一意のものを追加します(重複をチェックするなど)。ただし、プリミティブに対してのみ機能します。

あなたがすべきことはthings、独自のコレクションに入れて、名前に一意のインデックスを作成することです。次に、この変更を行います

things: {
  type: [{type: ObjectId, ref: 'thingscollection'}]
}

このようにできる

BoxModel.update({
  _id: some_box_id, // a valid 'box' ObjectId
  "things": { "$ne": thingObj._id }
},
{
  $addToSet: { things: thingObj._id}
}, 
function(err) {
  if (err) // handle err
  ...
});

そして、そこにある完全なドキュメントを取得するため.populateに onを使用してフェッチするとき。things

それはまさにあなたが望む方法ではありませんが、それはあなたが目指しているものを達成するかもしれないデザインです.

于 2015-11-04T00:53:31.423 に答える