【问题标题】:Mixing MongoDB query types (and, or)混合 MongoDB 查询类型(和,或)
【发布时间】:2012-04-29 13:01:00
【问题描述】:

我正在使用 MongoDB 存储有关咖啡的信息,但查询时遇到问题。

我的文档结构是:

{ _id: "Thailand Bok", tags: ["Strong", "Smooth", "Dark"] }

我正在尝试创建允许我搜索名称或标签的查询。

因此,鉴于查询字符串可能是“Thailand Bok”或 [“Strong”、“Smooth”],我想搜索包含 _id 或每个标签的请求。

如果我用 SQL 术语思考,可能是这样的:

"WHERE `_id` like 'Not present%' OR ("Strong" IN `tags` AND "Smooth" IN `tags`)"

到目前为止我的查询是:

{ 
    $or: [
      { _id: { $regex: '^Not present', '$options': 'i' } },
      { 
          $and: [ 
              { tags: 'Strong' }, 
              { tags: 'Smooth' } 
          ]
      }
    ]
}

编辑:更正查询中的错误并澄清如果_id匹配或标签匹配,它应该可以工作

【问题讨论】:

  • 你觉得怎么样?你需要$and周围的'吗?

标签: mongodb


【解决方案1】:

$and 仅在我使用 1.8.2 的 MongoDB 2.0+ 版本中受支持

【讨论】:

    【解决方案2】:

    除了 $or 使用花括号而不是方括号之外,您的查询似乎没问题。

    {$or: [
      {_id: {$regex: '^hailand', $options: 'i'} }, 
      {'$and': [
           {tags: 'Strong'}, 
           {tags: 'Smooth'}
       ]}
    ]}
    

    工作得很好。

    【讨论】:

    • 抱歉,这是一个复制错误。我已经尝试过您的查询,它突出了我的问题。当我直接复制你的 ^hailand 时,我没有得到任何搜索结果。但如果我使用 ^Thailand,我会得到搜索结果。我试图达到的结果是您可以匹配名称或标签。
    • 这很奇怪,因为当我运行这个查询时 - 我得到了结果:---> db.items.find({$or: [{_id: {$regex: '^hailand', $options: 'i'} }, {'$and': [{tags: 'Strong'}, {tags: 'Smooth'}]}]}) --- { "_id" : "Thailand Bok", "标签”:[“强”、“平滑”、“暗”] }
    • ... 啊,答案是我是个白痴 :) $ 并且仅在 2.0+ 中有效,我使用的是 1.8.2。对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2021-12-15
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多