2015-04-03 58 views
1

我只是试图做一个类似于.findOne的基本查找,但在Mongoose的子文档数组中。我应该简单地遍历数组寻找合适的子文档吗?如何在给定父文档和子文档中的值的情况下找到Mongoose子文档?

我有一个模式,像这样:

var RegionSchema = new Schema({ 
    "metadata": { 
    "regionType": String, 
    "name": String, 
    "children": [{ 
     "name": String, 
     "childType": String 
    }], 
    "parent": Schema.ObjectId 
    }, 

    "data": [DataContainer] 
}); 

我知道,我想找到一个dataDataContainerdataYear等于"2014"。我是MongoDB的新手,所以我不知道许多高级命令。什么是最有效的方法?

编辑:dataYear保证在该阵列中是唯一的。

+0

您还可以显示'DataContainer'模式以及包含数据的示例文档吗? – chridam 2015-04-03 16:59:51

+0

这很简单。对于这个问题,DataContainer包含'population'(Number)和'dataYear'(String)。 'dataYear'对于数组中的每个子文档都是唯一的。所以这不是一个大问题。 – Antrikshy 2015-04-03 17:02:38

+0

@Antrikshy你检查了建议的答案吗? – 2015-04-08 19:07:37

回答

0

为此使用聚合框架。您的汇总管道将由操作阶段组成,该操作阶段与数据数组元素对象具有值为"2014"的字段dataYear的集合中的文档相匹配。下一个流水线阶段将是对数据阵列对象的$unwind操作和对阵列进行过滤的另一个$match流水线。最后阶段将是$project解构阵列。例如,假设你有一个使用RegionSchema模型Region,你的猫鼬代码如下:

Region.aggregate([ 
    // similar query object you use in findOne() can also be applied to the $match 
    { 
     "$match": { 
      "data.dataYear": "2014", 
      "metadata.name": "example text" 
     }   
    }, 
    { 
     "$unwind": "$data" 
    }, 
    { 
     "$match": { 
      "data.dataYear": "2014" 
     }   
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "dataYear": "$data.dataYear", 
      "population": "$data.population" 
     }   
    } 
], function(err, docs){ 

}); 
+0

但是我已经用'findOne'来获得一个'Region'文件,我只想在那一年的'data'中找到一个子文档。可能还有其他''''data.dataYear ==“2014”'',但我只想看看这个数组。 – Antrikshy 2015-04-03 17:24:10

+0

@Antrikshy您在'Region.findOne({query})'中使用的查询对象也适用于使用第一个'$ match'操作管道阶段的聚合。试试看,这会给你你需要的子文档。让我知道,如果它不适合你。 – chridam 2015-04-03 18:05:01

0

你可以添加一个$elemMatch您的查询。

假设Region是模型:

Region.findOne(...).select({data: {$elemMatch: {dataYear: 2014}}); 

这将返回Region文件与仅含有匹配项的data阵列。

更新:如果您已经有一个包含子文档数组的文档,您可以使用类似lodash的find方法来选择子文档。注意:这会将子文档转换为POJO。

_.find(region.data.toObject(), {dataYear: 2014}); 
+0

我说我有父文档,只需要在这个父代中查找一个子文档。 – Antrikshy 2015-04-04 03:11:00

+1

所以你还想要整个阵列呢?对不起,你原来的问题并不清楚。 Mongoose对subdocumnets唯一的匹配方法是一个['id']()方法,只有在知道子文档的id时才有用。由于您正在使用其他字段进行匹配,因此您将不得不使用外部解决方案来执行此操作。更新我的答案以显示示例。 – 2015-04-04 14:15:44

相关问题