【问题标题】:Unwind array of objects mongoDB展开对象数组 mongoDB
【发布时间】:2015-02-25 19:09:34
【问题描述】:

我的收藏包含以下两个文档

{
      "BornYear": 2000,
      "Type": "Zebra",
      "Owners": [
        {
          "Name": "James Bond",
          "Phone": "007"
        }
      ]
    }

    {
      "BornYear": 2012,
      "Type": "Dog",
      "Owners": [
        {
          "Name": "James Brown",
          "Phone": "123"
        },
        {
          "Name": "Sarah Frater",
          "Phone": "345"
        }
      ]
    }

我想找到所有有一个主人叫 James 的动物。 我尝试展开 Owners 数组,但无法访问 Name 变量。

【问题讨论】:

    标签: regex mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用点符号来匹配数组元素的字段:

    db.test.find({'Owners.Name': /James/})
    

    【讨论】:

      【解决方案2】:

      这里有点用词不当。要在“集合”中找到“对象”或项目,那么您真正需要做的就是匹配“对象/项目”

      db.collection.find({
          "Owners.Name": /^James/
      })
      

      这可行,但当然不会将结果限制为“詹姆斯”的“第一次”匹配,这将是:

      db.collection.find(
          { "Owners.Name": /^James/ },
          { "Owners.$": 1 }
      )
      

      作为基本投影。但这仅提供“单一”匹配,这意味着您需要 .aggregate() 方法,如下所示:

      db.collection.aggregate([
          // Match the document
          { "$match": {
              "Owners.Name": /^James/
          }},
      
          // Flatten  or de-normalize the array
          { "$unwind": "Owners" },
      
      
          // Filter th content
          { "$match": {
              "Owners.Name": /^James/
          }},
      
          // Maybe group it back
          { "$group": {
              "_id": "$_id",
              "BornYear": { "$first": "$BornYear" },
              "Type": { "$first": "$Type" },
              "Ownners": { "$push": "$Owners" }
          }}
      ])
      

      这允许在过滤时在子文档数组中进行多个匹配。

      另一点是正则表达式上的“锚”或“^”插入符号。您确实需要它,以便在可以正确使用索引的字符串的“开始”处进行匹配。开放式正则表达式操作不能使用索引。

      【讨论】:

        猜你喜欢
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-26
        • 2019-04-17
        • 2021-07-20
        • 2017-01-15
        • 2020-12-27
        相关资源
        最近更新 更多