を使用して配列からオブジェクトを削除する方法。私はマングースを使用して文書内の配列からオブジェクトを削除しようとしているマングース
スキーマは以下の通りです:
var diveSchema = new Schema({
//irrelevant fields
divers: [{
user: { type: Schema.Types.ObjectId, ref: 'User', required: true },
meetingLocation: { type: String, enum: ['carpool', 'onSite'], required: true },
dives: Number,
exercise: { type: Schema.Types.ObjectId, ref: 'Exercise' },
}]
});
可能エントリは
{
//irrelevant fields
"divers": [
{
"_id": "",
"user": "123456789",
"meetingLocation": "carpool",
"exercise": "34567890",
},
{
"_id": "",
"user": "123456780",
"meetingLocation": "onSite",
"exercise": "34567890",
}
]
}
ことができるが(注意私はこれで_id
を知らない私はuser
が123456789
あるエントリを削除したいとポイント)。
これを正しく行うにはどうすればよいですか?
私は次のことを試してみました:
var diveId = "myDiveId";
var userIdToRemove = "123456789"
Dive.findOne({ _id: diveId }).then(function(dive) {
dive.divers.pull({ user: userIdToRemove });
dive.save().then(function(dive) {
//do something smart
});
});
これは、ドキュメントに変化がyieledません。
また、私は全体divers
配列が与えられたのダイビングのために空になったことが結果として得た。これにより
Dive.update({ _id: diveId }, { "$pull": { "divers": { "diver._id": new ObjectId(userIdToRemove) } } }, { safe: true }, function(err, obj) {
//do something smart
});
を試してみました。
この程度
これは動作するようです!私は前に 'user'を使用しようとしなかったので感謝していますが、私が間違っていたかを説明することができますが、私は、このオプション' {安全:、真のマルチ:真}どのように 'multi'一部 – Sonaryr
を追加しませんでした'' {_id:diveId} 'という1つのドキュメントを照会する更新操作があるときに役に立ちますか?単一のドキュメントおよび$のため – chridam
@chridam、あなたは正しいです、それはマルチ使用することをやりすぎだろう引っ張っ:私はできるだけ早くそれだけで一つの操作(ないドキュメント)を同じように実行を停止する一部のドライバーに遭遇してきた、真のが、正直に言うとあなたがマルチを真実として提供しなければ。たとえば、配列の中で$ setを呼び出すと、ドライバは何らかのドライバの配列の最初の要素を設定します。それが私が使う理由です。あなたはそれを避けることができます。あなたは多分それが機能しなかった理由は、私の以前のコメントに記載されている、この同じクエリをしようとしなかった場合 –