如何在MongoDB中一起进行“ $ and”和“ $ or”查询?

时间:2018-06-29 05:16:57

标签: node.js database mongodb express mongoose

我有MongoDB集合,我的要求如下

这有效:(仅返回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个值。但是我只想拥有两者   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 } ] } ] } )

自昨天以来,我一直在尝试解决此问题,但我无法解决,感谢您的帮助(对不起我的英语)

已解决:根据条件已解决

2 个答案:

答案 0 :(得分:0)

  

我想只获得频率= 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

答案 1 :(得分:0)

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

要返回频率= 1,难度= 2的记录,则必须使用$ and运算符。

并且根据MongoDB文档,当指定用逗号分隔的表达式列表时,它提供了隐式AND操作。 因此,您可以直接使用:

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

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