[英]Not able to make the single array of objects with two different arrays for making the start and end range in mongodb aggregation
I have a dataset like this:我有一个这样的数据集:
[
{
"_id" : ObjectId("6332c4d8a813124264860f83"),
"prefixStr" : "ABCD",
"startRange" : 1,
"endRange" : 5,
"createdate" : ISODate("2022-09-27T09:39:36.319Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4d8a813124264860f84"),
"prefixStr" : "ABCD",
"startRange" : 1,
"endRange" : 5,
"createdate" : ISODate("2022-09-27T09:39:36.319Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4d8a813124264860f85"),
"prefixStr" : "ABCD",
"startRange" : 1,
"endRange" : 5,
"createdate" : ISODate("2022-09-27T09:39:36.319Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4d8a813124264860f86"),
"prefixStr" : "ABCD",
"startRange" : 1,
"endRange" : 5,
"createdate" : ISODate("2022-09-27T09:39:36.320Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4d8a813124264860f87"),
"prefixStr" : "ABCD",
"startRange" : 1,
"endRange" : 5,
"createdate" : ISODate("2022-09-27T09:39:36.320Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4e1a813124264860f88"),
"prefixStr" : "ABCD",
"startRange" : 11,
"endRange" : 15,
"createdate" : ISODate("2022-09-27T09:39:45.739Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4e1a813124264860f89"),
"prefixStr" : "ABCD",
"startRange" : 11,
"endRange" : 15,
"createdate" : ISODate("2022-09-27T09:39:45.743Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4e1a813124264860f8a"),
"prefixStr" : "ABCD",
"startRange" : 11,
"endRange" : 15,
"createdate" : ISODate("2022-09-27T09:39:45.746Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4e1a813124264860f8b"),
"prefixStr" : "ABCD",
"startRange" : 11,
"endRange" : 15,
"createdate" : ISODate("2022-09-27T09:39:45.747Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4e1a813124264860f8c"),
"prefixStr" : "ABCD",
"startRange" : 11,
"endRange" : 15,
"createdate" : ISODate("2022-09-27T09:39:45.748Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4eaa813124264860f8d"),
"prefixStr" : "ABCD",
"startRange" : 21,
"endRange" : 25,
"createdate" : ISODate("2022-09-27T09:39:54.203Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4eaa813124264860f8e"),
"prefixStr" : "ABCD",
"startRange" : 21,
"endRange" : 25,
"createdate" : ISODate("2022-09-27T09:39:54.204Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4eaa813124264860f8f"),
"prefixStr" : "ABCD",
"startRange" : 21,
"endRange" : 25,
"createdate" : ISODate("2022-09-27T09:39:54.205Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4eaa813124264860f90"),
"prefixStr" : "ABCD",
"startRange" : 21,
"endRange" : 25,
"createdate" : ISODate("2022-09-27T09:39:54.207Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c4eaa813124264860f91"),
"prefixStr" : "ABCD",
"startRange" : 21,
"endRange" : 25,
"createdate" : ISODate("2022-09-27T09:39:54.208Z"),
"__v" : 0
},
{
"_id" : ObjectId("6332c623edb18941f8aeabea"),
"prefixStr" : "ANKT001",
"startRange" : 0,
"endRange" : 0,
"createdate" : ISODate("2022-09-27T09:45:07.570Z"),
"__v" : 0
}
]
Now I want to aggregate the collection so that result will be like this:现在我想聚合集合,结果将是这样的:
Expected results预期成绩
[
{ _id: 'ANKT001', range: [ {start: 0, end: 0 }]},
{ _id: 'ABCD', range: [ {start: 1, end: 5 }, {start: 11, end: 15 }, {start: 21, end: 25 } }
]
This is my code by which I am getting the result but not as expectation which was mentioned above:这是我得到结果的代码,但与上面提到的预期不同:
My current query result我当前的查询结果
[
{ _id: 'ANKT001', startRange: [ 0 ], endRange: [ 0 ] },
{ _id: 'ABCD', startRange: [ 11, 21, 1 ], endRange: [ 5, 15, 25 ] }
]
This is My Query:这是我的查询:
const getUsedRanges = await MyCode.aggregate(
[
{
$group: {
_id: "$prefixStr",
startRange: { $addToSet: "$startRange"},
endRange: { $addToSet: "$endRange" },
}
},
{
$project : {
_id: 1,
startRange: 1,
endRange: 1,
}
}
]
).exec();
console.log(getUsedRanges);
if (getUsedRanges) {
let resp = getUsedRanges.map(x => {
return {
prefix: x._id,
startRange: x.startRange.sort((a, b) => {
return a - b;
}),
endRange: x.endRange.sort((a, b) => {
return a - b;
})
}
});
console.log(resp);
}
Can Anyone guide me how to make the query to get the response in array of objects for range array谁能指导我如何进行查询以获取范围数组的对象数组中的响应
You have to create range
property and pass start
and end
propeties inside $addToSet
operator,您必须在
$addToSet
运算符中创建range
属性并传递start
和end
属性,
const getUsedRanges = await MyCode.aggregate(
{
$group: {
_id: "$prefixStr",
range: {
$addToSet: {
start: "$startRange",
end: "$endRange"
}
}
}
}
]).exec();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.