在mongo多键复合查询上执行AND(有或没有mongoid)

时间:2014-08-03 14:47:56

标签: mongodb mongoid mongodb-query

我有以下格式的数据结构:

{
  topAttribute: {
      subAttribute:
         [
          { eventType: "SPECIAL", date: "20121231" }
          { eventType: "NOTSPECIAL", date: "20131012" }
          { eventType: "NOTSPECIAL", date: "20131122" }
          ...
         ]
      }
 }

我试图识别eventType为' SPECIAL'的记录。并且日期为' 20121231"。我尝试使用以下多键样式查询来完成此任务:

Mongoid:

Item.where('topAttribute.subAttribute.eventType' => 'SPECIAL').and('topAttribute.subAttribute.date' => '20121231').all

MongoDB的:

db.items.find( { 'topAttribute.subAttribute.eventType': 'SPECIAL', 'topAttribute.subAttribute.date': '20121231'} ) 

但是,当我运行此查询时,它会找到 记录,其eventType为' SPECIAL' OR 记录日期为' 20121231'。这不是我想要的结果。

我如何重新构建此查询 - 或使用其他搜索/聚合策略 - 仅显示eventType为' SPECIAL'的记录。 AND 记录日期为' 20121231',并排除所有其他记录?

1 个答案:

答案 0 :(得分:1)

如果要查找包含满足所有字段的数组元素的文档,则需要使用$elemMatch运算符。

db.items.find( 
    { 'topAttribute.subAttribute' : {
        $elemMatch: {
             'eventType': 'SPECIAL',
             'date': '20121231'
        }
    } 
);