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
,那么您可以在另一个阶段对其进行筛选
否则,您必须在后端代码中执行此操作