【问题标题】:Mongoose: findOneAndUpdate() with a logical operator in the query?Mongoose:在查询中带有逻辑运算符的 findOneAndUpdate()?
【发布时间】:2015-12-25 11:22:42
【问题描述】:

我做过这样的事情(请原谅我这个例子的愚蠢...... :-):

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

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

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

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

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    如果引用文档中的另一个字段,您需要$where

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

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

    $where 运算符本身允许 JavaScript 评估发出的查询中的条件。通常最好使用其他“本机”运算符条件发出,因为评估本身不能利用索引来提高性能。

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

    但是,如果您想从变量中获取“外部”值,则只需使用本机 $gt 运算符:

    var date = new Date("1990-01-01");
    
    Person.findOneAndUpdate(
        { "dateOfBirth": { "$gt": date } },
        { "$set": { isYoung: true } },
        { "new": true },
        function (err, doc) {
        }
    );
    

    MongoDB 查询不是 SQL 语句,您需要事先评估值。因此,$gt 是一个“本地”运算符,除非您“确实需要”将文档中的字段相互比较,否则您应该使用它。

    【讨论】:

    • to issue with other "native" operator conditions 是什么意思?
    • @MarcoS 我认为您需要阅读所有内容。区别在于“比较文档中的字段”与“比较外部值”。在后一种情况下,您通常希望使用本机运算符,例如$gt,并且最好在前一种情况下使用这样的本机运算符在应用该条件之前过滤掉可能的文档。由于已经说明的原因,JavaScript evaled 语句不能使用索引。
    • 对不起...我确实在您完成答案之前发表了我的评论...现在很清楚... :-)
    • 可能findOneAndUpdate() 不是正确的使用方法,如果我有 许多 人符合该标准,并且我想一次更新所有这些人......: -(我找不到findAndUpdate()findAllAndUpdate()... :-(
    • @MarcoS 就叫.update()。但是,当然,绝对没有选择“返回”匹配文件的选项,例如设计声明。当然,如果您真的认为您需要返回每个修改过的文档,那么您最好在该过程完成后执行.find()。他们有不同的目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多