繁体   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

我有一个这样的数据集:

[
    {
        "_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
    }
]

现在我想聚合集合,结果将是这样的:

预期成绩

[
  { _id: 'ANKT001', range: [ {start: 0, end: 0 }]},
  { _id: 'ABCD', range: [ {start: 1, end: 5 }, {start: 11, end: 15 }, {start: 21, end: 25 } }
]

这是我得到结果的代码,但与上面提到的预期不同:

我当前的查询结果

[
  { _id: 'ANKT001', startRange: [ 0 ], endRange: [ 0 ] },
  { _id: 'ABCD', startRange: [ 11, 21, 1 ], endRange: [ 5, 15, 25 ] }
]

这是我的查询:

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

谁能指导我如何进行查询以获取范围数组的对象数组中的响应

您必须在$addToSet运算符中创建range属性并传递startend属性,

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

操场

暂无
暂无

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

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