Node.js Mongodb如何查询特定文档的数组子集
我想运行一个查询来选择特定的文档。然后在每个文档上,打开子文档数组并运行查询以筛选这些子文档 例如:Node.js Mongodb如何查询特定文档的数组子集,node.js,mongodb,aggregation-framework,Node.js,Mongodb,Aggregation Framework,我想运行一个查询来选择特定的文档。然后在每个文档上,打开子文档数组并运行查询以筛选这些子文档 例如: { "_id" : ObjectID(23412351346435), "list" : [ {date: ISODate(2015-01-12T00:00:00.000Z), name: "Jan 12"}, {date: ISODate(2015-01-13T00:00:00.000Z), name: "Jan 13"}, {date: ISODate(201
{
"_id" : ObjectID(23412351346435),
"list" : [
{date: ISODate(2015-01-12T00:00:00.000Z), name: "Jan 12"},
{date: ISODate(2015-01-13T00:00:00.000Z), name: "Jan 13"},
{date: ISODate(2015-01-14T00:00:00.000Z), name: "Jan 14"}
]
}
我猜我可以用Mongo的aggregate
函数做点什么。我已经能够匹配我想要的文档,但是如何才能在数组中获得子查询?我尝试使用$elemMatch
,但这只返回数组中与日期范围匹配的第一项
当我查询ObjectID(23412351346435)
和日期范围2015-01-12到2015-01-13时,我想让它返回这个
{
"_id" : ObjectID(23412351346435),
"list" : [
{date: ISODate(2015-01-12T00:00:00.000Z), name: "Jan 12"},
{date: ISODate(2015-01-13T00:00:00.000Z), name: "Jan 13"}
]
}
您可以使用运算符。它允许您在文档中获取一个数组,并使用每个数组元素克隆该文档。然后你就可以在球场上比赛了。如有必要,您可以使用$group来备份文档
[
{$match:{...}},
{$unwind:"myfield"},
{$match:{"myfield.name":"Jan 12"}},
{$group:{ _id:"$id", "myfield":{$push:"$myfield"} }}
]
请注意,对于大型文档集,$unwind速度较慢,而对于多个数组,$unwind速度较慢。这是Mongo2.4.x的唯一选择。通过重新排列数据,使其不具有数组,您可能会得到更好的服务。正如您所猜测的,您可以使用
聚合
来获得所需的结果。您在应用程序中需要执行以下步骤
\u id
完成的)列表
数组\u id
返回文档db.collection.aggregate([
{ "$match": { "_id": ObjectId("54ef8b0acfb269d664de0b48")} },
{ "$unwind": "$list" },
{ "$match": {
"list.date": { $gte: ISODate("2015-01-12T00:00:00.000Z"),
$lte: ISODate("2015-01-13T00:00:00.000Z")
}
}},
{ "$group": {
"_id": "$_id",
"list": { "$push": { "date": "$list.date", "name": "$list.name" }}
}}
]);
啊,放松+小组是我一直在寻找的。我没想过用小组来把他们重新组合起来。你能得到你想要的结果吗?