首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将"$and“和"$or”查询合并到MongoDB中?

如何将"$and“和"$or”查询合并到MongoDB中?
EN

Stack Overflow用户
提问于 2018-06-29 05:16:56
回答 2查看 38关注 0票数 0

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

这是可行的:(只使用frequency:1记录返回)

代码语言:javascript
复制
http://localhost:3000/words?frequency=1

这是可行的:(只使用difficulty:2记录返回)

代码语言:javascript
复制
http://localhost:3000/words?difficulty=2

这行得通,但不是我想要的

代码语言:javascript
复制
http://localhost:3000/words?frequency=1&difficulty=2

此查询不返回具有frequency=1 difficulty=2值的查询。但是我只想得到 frequency=1difficulty=2值。 此查询应该只返回"word":"first",但返回时使用"word":"first""word":"fourth"

示例MongoDB集合:

代码语言:javascript
复制
{
    "word": "first",
    "frequency": 1,
    "difficulty": 2
},
{
    "word": "second",
    "frequency": 1,
    "difficulty": 1
},
{
    "word": "third",
    "frequency": 2,
    "difficulty": 1
},
{
    "word": "fourth",
    "frequency": 2,
    "difficulty": 2
},

这是我的疑问:

代码语言:javascript
复制
const difficulty = req.query.difficulty;
const frequency = req.query.frequency;
Words.find( { $or: [ { difficulty: difficulty }, { frequency: frequency }, { $and: [ { difficulty: difficulty }, { frequency: frequency } ] } ] } )

从昨天起,我一直在努力解决这个问题,但我没能解决,谢谢你的帮助(对不起,我的英语)。

解决:有条件求解

EN

回答 2

Stack Overflow用户

发布于 2018-06-29 05:22:07

我只想得到同时拥有frequency=1,difficulty=2values

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

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

您的查询将是:

代码语言:javascript
复制
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

试试这个:

代码语言:javascript
复制
db.collection.find({
  $and: [
    {
      frequency: 1
    },
    {
      difficulty: 2
    }
  ]
});

而为了

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

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

代码语言:javascript
复制
db.collection.find( { $or: [ { difficulty: difficulty }, { frequency: frequency } ] } )

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

票数 0
EN

Stack Overflow用户

发布于 2018-06-29 07:44:40

您正在将查询混合在一个$or操作符中。

要返回带有frequency=1、difficulty=2值的记录,必须使用$and运算符。

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

代码语言:javascript
复制
Words.find({
   frequency: 1,
   difficulty: 2
});

但是对于指定同一个运算符的多个表达式和查询,请参考MongoDB文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51094747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档