通过 subdocumentId 从子文档数组中删除一个元素
Removing an element from an array of subdocuments by subdocumentId
所以我有以下架构:
var questionsSchema = new Schema({
nr: Number,
points: Number,
description: String,
groups: [{
type: Schema.Types.ObjectId,
ref: 'Group',
default: []
}],
createdOn: {type: Date, default: Date.now()},
isActive: {type: Boolean, default: true}
});
var roundSchema = new Schema({
name: String,
index: Number,
questions: [ questionsSchema ]
});
现在我有一个操作来删除一个问题(问题是唯一的)而没有回合(父)_id。
我看过 here 如何从数组中提取元素,但是我找不到正确的方法,在 link 中它是一个非数组-文件所以这和我的情况有点不同。
我尝试过的:
function removeQuestionById(req, res) {
Round.update({"questions._id": req.params.id}, {$pull: {"questions._id": req.params.id}}, function(err, rowsAffected){
if(err){
res.sendStatus(500);
return console.log("An error occured when trying to remove a question!", err);
}
console.log("Amount of rows affected was " + rowsAffected);
return res.end();
})
}
没有用,所以我假设我只需要在更新语句中指定子文档的字段:
function removeQuestionById(req, res) {
Round.update({"questions._id": req.params.id}, {$pull: {"_id": req.params.id}}, function(err, rowsAffected){
if(err){
res.sendStatus(500);
return console.log("An error occured when trying to remove a question!", err);
}
console.log("Amount of rows affected was " + rowsAffected);
return res.end();
})
}
也没有用,我在这两种情况下受影响的行数都是 0。
在过去的几个小时里,我尝试了其他几种方法,none 成功了。
注意:请求对象中的问题_id是正确的。
我终于让这个工作了,但是我确实需要父 _id 来做这个:
Round.update({"_id": req.params.roundId}, {$pull: {"questions": {"_id": req.params.questionId}}},function cb(err) {
if(err){
res.sendStatus(500);
return console.log("An error occured when trying to remove a question!", err);
}
return res.end();
});
如果有人知道无需 parentId 即可执行此操作的方法,请告诉。
编辑:找到它,只需将 _id
替换为 questions._id
并关闭正确的参数值
所以我有以下架构:
var questionsSchema = new Schema({
nr: Number,
points: Number,
description: String,
groups: [{
type: Schema.Types.ObjectId,
ref: 'Group',
default: []
}],
createdOn: {type: Date, default: Date.now()},
isActive: {type: Boolean, default: true}
});
var roundSchema = new Schema({
name: String,
index: Number,
questions: [ questionsSchema ]
});
现在我有一个操作来删除一个问题(问题是唯一的)而没有回合(父)_id。
我看过 here 如何从数组中提取元素,但是我找不到正确的方法,在 link 中它是一个非数组-文件所以这和我的情况有点不同。
我尝试过的:
function removeQuestionById(req, res) {
Round.update({"questions._id": req.params.id}, {$pull: {"questions._id": req.params.id}}, function(err, rowsAffected){
if(err){
res.sendStatus(500);
return console.log("An error occured when trying to remove a question!", err);
}
console.log("Amount of rows affected was " + rowsAffected);
return res.end();
})
}
没有用,所以我假设我只需要在更新语句中指定子文档的字段:
function removeQuestionById(req, res) {
Round.update({"questions._id": req.params.id}, {$pull: {"_id": req.params.id}}, function(err, rowsAffected){
if(err){
res.sendStatus(500);
return console.log("An error occured when trying to remove a question!", err);
}
console.log("Amount of rows affected was " + rowsAffected);
return res.end();
})
}
也没有用,我在这两种情况下受影响的行数都是 0。 在过去的几个小时里,我尝试了其他几种方法,none 成功了。
注意:请求对象中的问题_id是正确的。
我终于让这个工作了,但是我确实需要父 _id 来做这个:
Round.update({"_id": req.params.roundId}, {$pull: {"questions": {"_id": req.params.questionId}}},function cb(err) {
if(err){
res.sendStatus(500);
return console.log("An error occured when trying to remove a question!", err);
}
return res.end();
});
如果有人知道无需 parentId 即可执行此操作的方法,请告诉。
编辑:找到它,只需将 _id
替换为 questions._id
并关闭正确的参数值