【问题标题】:How to use same field multiple times in MongoDB find query in NodeJS如何在 MongoDB 中多次使用同一字段在 NodeJS 中查找查询
【发布时间】:2018-11-17 01:30:27
【问题描述】:

我有一个 MongoDB 集合,其中的记录具有 "name" 字段,我正在尝试执行查找查询,其中名称字段在查询中出现两次。我想通过$nin 排除某些名称,并对其他名称执行正则表达式搜索。它似乎不起作用,因为它返回所有记录。如果我只有正则表达式搜索或 $nin 搜索,它会按预期工作。

db.users.find({name:{$nin:[current_user]}).cb(array) - 有效

db.users.find({name:new RegExp(/query/)}).cb(array) - 有效

db.users.find({name:{$nin:[current_user]}, name:new RegExp(/query/)}).cb(array) - 不起作用,current_user 不会从查找结果中排除。

我有一种感觉,find 命令对同一字段的多次出现进行最后一次查询,是这样吗?我该如何解决?

感谢您的帮助, 加里

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您的查询 JSON 对象包含两次 name 字段,它会中断查询。注意$and mongo 查询运算符。有两种方法可以构造正确的查询:

    1) db.users.find({ $and: [{ name: { $nin: [current_user] } }, { name: { $regex: new RegExp(/query/) } }] })

    2) db.users.find({ name: { $nin: [current_user], $regex: new RegExp(/query/) } })

    另外,如果您只排除一个用户,您可以使用$ne 运算符而不是$nin

    【讨论】:

    • 我的印象是,在 find 命令中以逗号分隔的键:值对列表相当于执行 AND 操作,但我猜不是当该字段被多次使用时。谢谢。
    • 是的,逗号分隔是正确的做法。使用 $and 不是正确的方法。所以 1) 不是这样做的方法,2) 是,除非你的正则表达式语法错误。
    • 1) 但为什么呢?我已经对简单的测试数据运行了这样的查询,它给了我预期的结果。 docs 还说“但是,如果查询需要对同一字段进行 AND 操作,例如 { price: { $ne: 1.99 } } AND { price: { $exists: true } },则要么对两个单独的表达式使用 $and 运算符,要么将运算符表达式组合为字段{ price: { $ne: 1.99, $exists: true } }"。也许我错过了什么? 2)感谢您指出这个错误!我已经更正了。
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多