Mongoose:findOneAndUpdate()在查询中带有逻辑运算符?

时间:2015-09-28 09:05:36

标签: node.js mongodb mongoose mongodb-query

我做过这样的事情(请原谅我关于示例的愚蠢......: - ):

var dateRef = new Date(1990, 1, 1);
Person.findOneAndUpdate({ dateOfBirth > dateRef }, { $set: { isYoung: true } }, function (err, doc) {
});

I.e。:我想将所有出生日期(dateOfBirth)晚于参考日期的人设置为每个Person文档的isYoung字段为true。

我的代码在语法上是错误的,当然......

所以问题是:有没有办法按我的要求去做?我喜欢它是一个原子(?)操作(与for(...)循环相反...)。

1 个答案:

答案 0 :(得分:1)

如果引用文档中的其他字段,则需要$where

Person.findOneAndUpdate(
    { "$where": "return this.dateOfBirth > this.dateRef" },
    { "$set": { isYoung: true } },
    { "new": true },
    function (err, doc) {
    }
);

如果您希望查看修改后的结果而不是原始未经修改的文档,则可能{ "new": true }

$where运算符本身允许JavaScript评估已发布查询中的条件。通常最好与其他" native"运营商条件,因为评估本身无法利用指数来提高绩效。

在这样的更新语句中没有其他方法可以将一个字段的值与另一个字段的值进行比较,除非您首先从服务器调用数据,但是由于文档之间可能发生更改,因此应该避免这种情况。 / p>

但如果你想要一个"外部"来自变量的值,然后只使用原生$gt运算符:

var date = new Date("1990-01-01");

Person.findOneAndUpdate(
    { "dateOfBirth": { "$gt": date } },
    { "$set": { isYoung: true } },
    { "new": true },
    function (err, doc) {
    }
);

MongoDB查询不是SQL语句,您可以事先评估值。因此$gt是一个" native"操作员和你应该使用什么,除非你真的需要"将文档中的字段相互比较。