Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongodb如何查询特定文档的数组子集_Node.js_Mongodb_Aggregation Framework - Fatal编程技术网

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" }}
        }}
    ]);
    

    啊,放松+小组是我一直在寻找的。我没想过用小组来把他们重新组合起来。你能得到你想要的结果吗?