我有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 } ] } ] } )
自昨天以来,我一直在尝试解决此问题,但我无法解决,感谢您的帮助(对不起我的英语)
已解决:根据条件已解决
答案 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 } ] } )
答案 1 :(得分:0)
您在单个$ or运算符中混合查询。
要返回频率= 1,难度= 2的记录,则必须使用$ and运算符。
并且根据MongoDB文档,当指定用逗号分隔的表达式列表时,它提供了隐式AND操作。 因此,您可以直接使用:
Words.find({
frequency: 1,
difficulty: 2
});
但是对于 AND具有多个指定相同运算符的表达式的查询,请参考MongoDB Docs