Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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/Mongoose-聚合以将同一集合中的所有匹配文档分组到一个数组中_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongodb/Mongoose-聚合以将同一集合中的所有匹配文档分组到一个数组中

Node.js Mongodb/Mongoose-聚合以将同一集合中的所有匹配文档分组到一个数组中,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我所处的场景是,我希望找到一些类似的文档,并将它们分组到一个数组中。 以下是一个更好地说明该想法的示例: 正在收集的文件: { _id: 0, enabled: false, name:"name A", amounts:{ salary: 100 }, field_condition: "No", created_A: "2020-07-01" } { _id: 1, enabled:

我所处的场景是,我希望找到一些类似的文档,并将它们分组到一个数组中。 以下是一个更好地说明该想法的示例:

正在收集的文件:

{
   _id: 0,
   enabled: false,
   name:"name A",
   amounts:{ salary: 100 },
   field_condition: "No",
   created_A: "2020-07-01"
}

{
   _id: 1,
   enabled: false,
   name:"name A",
   amounts:{ salary: 100 },
   field_condition: "Yes",
   created_A: "2020-08-01"
}

{
   _id: 2,
   enabled: false,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "Yes",
   created_A: "2020-09-01"
}

{
   _id: 3,
   enabled: true,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01"
}



{
   _id: 4,
   enabled: false,
   name:"name B",
   amounts:{ salary: 100 },
   field_condition: "No",
   created_A: "2020-07-01"
}

{
   _id: 5,
   enabled: false,
   name:"name B",
   amounts:{ salary: 100 },
   field_condition: "Yes",
   created_A: "2020-08-01"
}

{
   _id: 6,
   enabled: false,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "Yes",
   created_A: "2020-09-01",

}

{
   _id: 7,
   enabled: true,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01"
}

我想查找启用字段为
true
且字段条件等于
No
的所有文档,这将导致这两个文档:

{
   _id: 3,
   enabled: true,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01"
}

{
   _id: 7,
   enabled: true,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_At: "2020-10-01"
}
然后,我想递归地查找前几个月的文档,这些文档与
名称
字段匹配,
启用:false
字段条件:“Yes”
,直到我找到一个
字段条件:“No”
并停止。然后,我想将上个月找到的文档放入实际文档的数组中:

[ 
 {
   _id: 3,
   enabled: true,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01",
   relatedDocs: [
      {
         _id: 1,
         enabled: false,
         name:"name A",
         amounts:{ salary: 100 },
         field_condition: "Yes",
         created_A: "2020-08-01"
      },

      {
         _id: 2,
         enabled: false,
         name:"name A",
         amounts:{ salary: 100 }, 
         field_condition: "Yes",
         created_A: "2020-09-01"
      }
   ]
},


{
   _id: 7,
   enabled: true,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_At: "2020-10-01",
   relatedDocs: [
      {
         _id: 1,
         enabled: false,
         name:"name B",
         amounts:{ salary: 100 },
         field_condition: "Yes",
         created_A: "2020-08-01"
      },

      {
         _id: 2,
         enabled: false,
         name:"name B",
         amounts:{ salary: 100 }, 
         field_condition: "Yes",
         created_A: "2020-09-01"
      }
   ]
 }
]
我对
$lookup
聚合做了很多尝试,但都没有成功。 非常感谢你的帮助。
谢谢

实现这一目标并非易事

可以按所需顺序对整个数据进行排序

db.collection.aggregate([
  {
    "$addFields": {//add a field to sort
      "consider": {
        $and: [
          {
            "$eq": [
              "$enabled",
              true
            ]
          },
          {
            $eq: [
              "$field_condition",
              "No"
            ]
          }
        ]
      },
      "date": {
        "$dateFromString": {
          "dateString": "$created_A"
        }
      }
    }
  },
  {
    $sort: { //sort the data
      "consider": -1,
      "date": -1
    }
  },
  {
    $group: {//group by name and data will have sorted result
      "_id": "$name",
      "data": {
        $push: "$$ROOT"
      },
      "considerDoc": {
        $first: "$$ROOT"
      }
    }
  }
])
如果您确定每个月都有一个条目,并且只有最近的月份在该字段条件中才有
Yes
,那么您可以在另一个阶段对其进行筛选

否则,您必须在后端代码中执行此操作