简体   繁体   English

无法使用两个不同的 arrays 制作单个对象数组,以在 mongodb 聚合中制作开始和结束范围

[英]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属性并传递startend属性,

const getUsedRanges = await MyCode.aggregate(
  {
    $group: {
      _id: "$prefixStr",
      range: {
        $addToSet: {
          start: "$startRange",
          end: "$endRange"
        }
      }
    }
  }
]).exec();

Playground操场

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM