如何根据父文档和子文档中的值找到Mongoose子文档?

时间:2015-04-03 16:57:59

标签: node.js mongodb mongoose

我只是尝试执行类似于.findOne的基本查找,但是在Mongoose的子文档数组中。我应该简单地遍历数组寻找正确的子文档吗?

我有一个这样的架构:

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

  "data": [DataContainer]
});

我知道我想在DataContainer中找到data dataYear"2014"等于dataYear。我是MongoDB的新手,所以我不知道很多高级命令。什么是最有效的方式?

编辑:{{1}}保证在该阵列中是唯一的。

2 个答案:

答案 0 :(得分:0)

使用聚合框架。您的聚合管道将包含 $match 操作阶段,该阶段匹配集合中的数据,其中数据数组元素对象的字段dataYear的值等于"2014" 。下一个管道阶段是数据数组对象上的$unwind操作,以及用于过滤数组的另一个$match管道。最后阶段将是$project解构数组。例如,假设您有一个使用Region的模型RegionSchema,您的猫鼬代码将为:

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){

});

答案 1 :(得分:0)

您可以在查询中添加$elemMatch

假设Region是模型:

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

这将返回Region文档,其中data数组仅包含匹配项。

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

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