【问题标题】:How to make a "$and" and "$or" query together in MongoDB?如何在 MongoDB 中同时进行“$and”和“$or”查询?
【发布时间】:2018-12-08 05:40:18
【问题描述】:

我有 MongoDB Collection,我的请求如下

这有效:(仅返回 frequency:1 记录)

http://localhost:3000/words?frequency=1

这有效:(仅返回 difficulty:2 记录)

http://localhost:3000/words?difficulty=2

这可行,但不是我想要的

http://localhost:3000/words?frequency=1&difficulty=2

此查询不会返回同时具有frequency=1 difficulty=2 值。但我只想得到 both frequency=1difficulty=2值。

这个查询应该只返回"word":"first",但返回"word":"first""word":"fourth"

MongoDB 集合示例:

{
    "word": "first",
    "frequency": 1,
    "difficulty": 2
},
{
    "word": "second",
    "frequency": 1,
    "difficulty": 1
},
{
    "word": "third",
    "frequency": 2,
    "difficulty": 1
},
{
    "word": "fourth",
    "frequency": 2,
    "difficulty": 2
},

这是我的查询:

const difficulty = req.query.difficulty;
const frequency = req.query.frequency;
Words.find( { $or: [ { difficulty: difficulty }, { frequency: frequency }, { $and: [ { difficulty: difficulty }, { frequency: frequency } ] } ] } )

我从昨天开始尝试解决这个问题,但我无法解决,感谢您的帮助(对不起我的英语)

已解决:根据条件解决

【问题讨论】:

    标签: node.js database mongodb express mongoose


    【解决方案1】:

    您在单个 $or 运算符中混合了查询。

    要返回同时具有频率=1、难度=2 值的记录,您必须使用 $and 运算符。

    根据 MongoDB 文档,它在指定逗号分隔的表达式列表时提供隐式 AND 操作。 所以可以直接使用:

    Words.find({
       frequency: 1,
       difficulty: 2
    });
    

    但对于 AND 查询具有多个指定相同运算符的表达式,请参阅 MongoDB Docs

    【讨论】:

    • 我解决了,谢谢,但你的回答不是解决方案,我已经知道了,再读一遍我的问题
    【解决方案2】:

    我只想得到同时具有频率=1,难度=2值

    您的查询将无法按预期工作,因为您已在 $or 和 $and 条件中提供了所有选项。因此,即使您在 API 调用中发送不同的参数,它也会像这样检查: 例如:

    发给:http://localhost:3000/words?frequency=1&difficulty=2

    您的查询将是:

    Words.find( { $or: [ { difficulty: 2 }, { frequency: 1 }, { $and: [ { difficulty: 2 }, { frequency: 1 } ] } ] } )
    

    正在搜索的内容 - 任一{难度:2} - 或 { 频率:1 } - 或 { 难度:2 } 和 { 频率:1 }

    这就是你得到混合结果的原因。

    这是你可以做的......

    检查控制器中的查询参数,并据此向数据库发送不同的查询并获取准确的数据。

    例如,

    发给:http://localhost:3000/words?frequency=1&difficulty=2

    试试这个:

    db.collection.find({
      $and: [
        {
          frequency: 1
        },
        {
          difficulty: 2
        }
      ]
    });
    

    对于

    http://localhost:3000/words?frequency=1

    http://localhost:3000/words?difficulty=2

    db.collection.find( { $or: [ { difficulty: difficulty }, { frequency: frequency } ] } )
    

    这是一个例子:https://mongoplayground.net/p/DmdxOx6wc8K

    【讨论】:

    • 好的,让我看看。
    • 所以.. 我应该在我的控制器中为查询创建 2 个函数?我不能在一个函数中这样做吗?
    • 是的,或者您可以在控制器中设置一个标志,并在此基础上更改查询控制器的查询。
    • 不起作用,当我为每个查询创建函数时,只有 http://localhost:3000/words?frequency=1&difficulty=1this 有效。 http://localhost:3000/words?frequency=1http://localhost:3000/words?difficulty=1 不工作,返回 0 结果:(
    • @AhmetZeybek 您可能希望默认使用 $and。但如果在查询中找到 filter_operator=OR,请使用 $or 替换查询。就像 localhost:3000/words?frequency=1&difficulty=1 使用 $and 运算符,localhost:3000/… 使用 $or。
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多