展开mongoDB对象的数组

时间:2014-12-29 15:25:32

标签: regex mongodb mongodb-query aggregation-framework

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

{
      "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"
        }
      ]
    }

我想找到所有拥有所有者的动物,这些动物与詹姆斯有关。 我尝试展开Owners数组,但无法访问Name变量。

2 个答案:

答案 0 :(得分:4)

您可以使用点表示法来匹配数组元素的字段:

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

答案 1 :(得分: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" }
    }}
])

在过滤时,它允许子文档数组中的多个匹配。

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