Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何删除Mongoose中的文档,前提是其中一个字段符合某些条件?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 如何删除Mongoose中的文档,前提是其中一个字段符合某些条件?

Node.js 如何删除Mongoose中的文档,前提是其中一个字段符合某些条件?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我只想删除一个符合某些条件的项目。应该是这样的: Session.findOne({ id:req.body.sessionId },function(err,session){ if(session.user == req.body.userId) { session.remove(); } }); 这显然不起作用。我怎样才能做到这一点呢?你能不能把查询合并起来 Session.findOne({ id:req.body.sessionId, user: re

我只想删除一个符合某些条件的项目。应该是这样的:

Session.findOne({ id:req.body.sessionId },function(err,session){
    if(session.user == req.body.userId) {
        session.remove();
    }
});

这显然不起作用。我怎样才能做到这一点呢?

你能不能把查询合并起来

Session.findOne({ id:req.body.sessionId, user: req.body.userId}).remove( callback );

你能不能把查询合并起来

Session.findOne({ id:req.body.sessionId, user: req.body.userId}).remove( callback );
老实说,只要做:

Session.remove({ "_id": req.body.sessionId },function(err,result) {

});
这样更有效、更安全

在您的示例中失败的原因是,变量不再是字符串,而是返回文档中的ObjectId。但这并不安全,所以不要那样做


如果您对匹配会话心存疑虑,请先执行以下操作:

if (session.user.toString() == req.body.userId) {
    Session.remove({ "_id": req.body.sessionId },function(err,result) {

    });
} else {
   // Not the same
}
请注意,ObjectId与请求中的字符串不同。转换或铸造其中一个。

老实说,只需执行以下操作:

Session.remove({ "_id": req.body.sessionId },function(err,result) {

});
这样更有效、更安全

在您的示例中失败的原因是,变量不再是字符串,而是返回文档中的ObjectId。但这并不安全,所以不要那样做


如果您对匹配会话心存疑虑,请先执行以下操作:

if (session.user.toString() == req.body.userId) {
    Session.remove({ "_id": req.body.sessionId },function(err,result) {

    });
} else {
   // Not the same
}

请注意,ObjectId与请求中的字符串不同。转换或强制转换其中一个条件。

您可以在Mongoose中同时测试多个条件。这应该对你有用

Session.findOne({ 
  id: req.body.sessionId,
  user: req.body.userId
})
.remove()
.exec();

您可以在Mongoose中同时测试多个条件。这应该对你有用

Session.findOne({ 
  id: req.body.sessionId,
  user: req.body.userId
})
.remove()
.exec();

如何在不立即删除实例的情况下测试if语句?您可以只测试findOne而不删除实例。如何在不立即删除实例的情况下测试if语句?您可以只测试findOne而不删除实例。如何在不立即删除实例的情况下测试if语句一次?@bmpasini你不需要。它要么匹配某个东西(_id是唯一的,所以只有一个东西)要么什么都不匹配。结果中将返回受影响的数字。请参阅添加的针对当前用户进行验证的更好处理。我最后只使用了
会话。在回调中删除
。我不需要转换成字符串,但是…@bmpasini我想告诉你的是,如果你执行
.findOne()
然后执行
.remove()。此外,无需检查从
.findOne()
返回的
\u id
值是否与您要求的值相同。如果要在删除之前检查现有变量,请在访问数据库之前包装要检查的逻辑。这就是如何高效地进行操作。在查询会话之前,我应该如何检查
session.user
?如何在不立即删除实例的情况下测试if语句?@bmpasini您不需要这样做。它要么匹配某个东西(_id是唯一的,所以只有一个东西)要么什么都不匹配。结果中将返回受影响的数字。请参阅添加的针对当前用户进行验证的更好处理。我最后只使用了
会话。在回调中删除
。我不需要转换成字符串,但是…@bmpasini我想告诉你的是,如果你执行
.findOne()
然后执行
.remove()。此外,无需检查从
.findOne()
返回的
\u id
值是否与您要求的值相同。如果要在删除之前检查现有变量,请在访问数据库之前包装要检查的逻辑。这就是你如何高效地做事。在查询会话之前,我应该如何检查
session.user