我只是尝试执行类似于.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}}保证在该阵列中是唯一的。
答案 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});