在对象数组中查找结果并匹配电子邮件地址字段

时间:2016-06-29 14:08:33

标签: mongodb mongodb-query

我正在尝试匹配emailAddress字段和page_slug。目前我正在使用以下内容,它只匹配modularSequence中的about页面:

db.getCollection('users').find({"modularSequence.page_slug": "about"}, {"modularSequence.$": 1 })

这有效并且返回:

{
    "_id" : ObjectId("5740c631742da6e83389abb4"),
    "modularSequence" : [ 
        {
            "page_id" : "1",
            "sequence" : "m_1",
            "category" : "headers",
            "page_slug" : "about"
        }
    ]
}

这是我想要的一半。我也希望返回emailAddress字段。我尝试过使用它,但它会返回所有内容和多个模块化元素:

db.getCollection('users').find({$and:[{"emailAddress": 'paul@example.com'}, {"modularSequence.page_slug": "about"}, {"modularSequence": {$elemMatch: {page_slug:'about'}}}]})

[
  {
    "emailAddress": "paul@example.com",
    "modularSequence": [
      {
        "page_slug": "about",
        "category": "headers",
        "sequence": "m_1",
        "page_id": "1"
      },
      {
        "page_slug": "contact",
        "category": "content",
        "sequence": "m_4",
        "page_id": "2"
      }
    ]
  }
]

如何匹配emailAddress字段和modularSequence.page_slug - 只有在电子邮件地址匹配且page_slug匹配时才返回结果?

1 个答案:

答案 0 :(得分:2)

您的$and数组也包含您的字段选择参数。但是,您无需在此处使用$and,因为默认情况下会隐式对多个查询字词进行AND运算,因此您可以将查询简化为:

db.users.find({"emailAddress": 'paul@example.com', "modularSequence.page_slug": "about"},
              {"emailAddress": 1, "modularSequence.$": 1})

这是您的第一个查询,但查询和字段选择参数都添加了emailAddress字段。

find的第一个参数是查询( docs),第二个参数是投影(这些文档中的字段),所以这是为什么那些领域有两次。投影中的$表示查询中匹配的modularSequence数组元素。