【发布时间】:2014-06-03 14:43:48
【问题描述】:
我有一个文档集合(称为“日志”),看起来类似于:
{
"_id" : ObjectId("52f523892491e4d58e85d70a"),
"ds_id" : "534d35d72491de267ca08e96",
"eT" : NumberLong(1391784000),
"vars" : [{
"n" : "ActPow",
"val" : 73.4186401367188,
"u" : "kWh",
"dt" : "REAL",
"cM" : "AVE",
"Q" : 99
}, {
"n" : "WinSpe",
"val" : 3.06327962875366,
"u" : "m/s",
"dt" : "REAL",
"cM" : "AVE",
"Q" : 99
}]
}
vars 数组包含大约 150 个子文档,而不仅仅是我上面显示的两个。我现在想做的是运行一个查询,检索上面显示的vars 数组中两个子文档的val。
使用聚合框架,我已经能够提出以下建议:
db.logs.aggregate( [
{ $match :
{ ds_id: "534d35d72491de267ca08e96",
eT: { $lt : 1391784000 },
vars: { $elemMatch: { n: "PowCrvVld", val: 3 }}
}
},
{ $unwind : "$vars" },
{ $match :
{ "vars.n" : { $in : ["WinSpe", "ActPow"] }},
{ $project : { "vars.n" : 1, N : 1}
}
]);
虽然这可行,但在运行较大的查询时,我遇到了 16MB 的限制。看到我在 vars 数组中有大约 150 个子文档,如果可能的话,我也想避免使用 $unwind。
使用常规查询和$elemMatch 我已经能够检索到其中一个值:
db.logs.TenMinLog.find({
ds_id : "534d35d72491de267ca08e96",
eT : { $lt : 1391784000 },
vars : { $elemMatch : { n : "PowCrvVld", val : 3 }
}
}, {
ds_id : 1,
vars : { $elemMatch : { n : "ActPow", cM : "AVE" }
});
我的问题归结为是否有一种方法可以在 find 的 <projection> 部分中多次在数组上使用 $elemMatch。如果没有,是否有另一种方法可以在不使用 $unwind 的情况下轻松检索这两个子文档?我也愿意接受其他我可能不知道的性能更高的建议。谢谢!
【问题讨论】:
标签: mongodb