Arrays 如何使用mongoose从数组中删除对象
我正在尝试使用mongoose从文档中的数组中删除对象 架构如下所示:Arrays 如何使用mongoose从数组中删除对象,arrays,node.js,mongodb,mongoose,Arrays,Node.js,Mongodb,Mongoose,我正在尝试使用mongoose从文档中的数组中删除对象 架构如下所示: var diveSchema = new Schema({ //irrelevant fields divers: [{ user: { type: Schema.Types.ObjectId, ref: 'User', required: true }, meetingLocation: { type: String, enum: ['carpool', 'onSite'], req
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' },
}]
});
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
});
});
可能的条目可以是
{
//irrelevant fields
"divers": [
{
"_id": "012345678",
"user": "123456789",
"meetingLocation": "carpool",
"exercise": "34567890",
},
{
"_id": "012345679",
"user": "123456780",
"meetingLocation": "onSite",
"exercise": "34567890",
}
]
}
假设我想删除user
为123456789
的条目(注意,此时我不知道\u id
)
如何正确地执行此操作
我尝试了以下方法:
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' },
}]
});
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
});
});
这并没有改变文件
我也试过了
Dive.update({ _id: diveId }, { "$pull": { "divers": { "diver._id": new ObjectId(userIdToRemove) } } }, { safe: true }, function(err, obj) {
//do something smart
});
我得到的结果是,整个潜水员
阵列对于给定的潜水是空的。这个呢
Dive.update({ _id: diveId }, { "$pull": { "divers": { "user": userIdToRemove } }}, { safe: true, multi:true }, function(err, obj) {
//do something smart
});
试试这个
update({{u id:diveId},{“$pull”:{“drivers”:{“user”:“123456789”}})
这似乎有效!谢谢,但你能解释一下我做错了什么吗,因为我以前确实尝试过只使用
user
,但我没有添加multi
部分当你有一个查询单个文档的更新操作{code>{id:diveId}
,这个选项如何有用?@chridam,你说得对,对于单文档和$pull,使用multi:true可能有些过分,但老实说,我遇到过一些驱动程序,如果您不提供multi:true,它们只执行一个操作(不是文档),就会停止执行。例如,如果在数组中调用$set,则驱动程序只为某个驱动程序设置数组的第一个元素。这就是我使用它的原因。您可以避免它。@如果您确实尝试了相同的查询,可能在我之前的评论中提到了它不起作用的原因,所有这些基本上都归结为您的驱动程序是如何实现操作的。答案与上面相同。