[英]How to make a “$and” and “$or” query together in MongoDB?
我有MongoDB Collection,我的要求如下
这有效:(仅以frequency:1
条记录返回)
http://localhost:3000/words?frequency=1
这有效:(仅以difficulty:2
返回difficulty:2
条记录)
http://localhost:3000/words?difficulty=2
这有效,但不是我想要的
http://localhost:3000/words?frequency=1&difficulty=2
该查询不返回
frequency=1
和difficulty=2
值。 但我想只得到既具有frequency=1
,difficulty=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 } ] } ] } )
自昨天以来,我一直在尝试解决此问题,但我无法解决,感谢您的帮助(对不起我的英语)
解决:根据条件解决
我只想同时获得频率= 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
您在单个$ or运算符中混合查询。
要返回频率= 1,难度= 2的记录,则必须使用$ and运算符。
并且根据MongoDB文档,当指定逗号分隔的表达式列表时,它提供了隐式AND操作。 因此,您可以直接使用:
Words.find({
frequency: 1,
difficulty: 2
});
但是对于具有多个表达式且指定同一个运算符的AND查询 ,请参阅MongoDB文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.