我有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=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 } ] } ] } )从昨天起,我一直在努力解决这个问题,但我没能解决,谢谢你的帮助(对不起,我的英语)。
解决:有条件求解
发布于 2018-06-29 05:22:07
我只想得到同时拥有frequency=1,difficulty=2values
您的查询不会像预期的那样工作,因为您已经在$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}。
这就是为什么你会得到混合结果。
你能做的就是..。
检查控制器中的查询参数,并在此基础上向DB发送不同的查询并获取准确的数据。
比如,
用途: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 } ] } )发布于 2018-06-29 07:44:40
您正在将查询混合在一个$or操作符中。
要返回带有frequency=1、difficulty=2值的记录,必须使用$and运算符。
根据MongoDB文档,它在指定逗号分隔的表达式列表时提供了一个隐式和操作。因此,您可以直接使用:
Words.find({
frequency: 1,
difficulty: 2
});但是对于指定同一个运算符的多个表达式和查询,请参考MongoDB文档
https://stackoverflow.com/questions/51094747
复制相似问题