【问题标题】:How to add sort,limit and skip in the aggregate query shown below?如何在如下所示的聚合查询中添加排序、限制和跳过?
【发布时间】:2018-05-03 07:34:05
【问题描述】:

这是我的数据结构

{
    "_id" : ObjectId("57f37f18517f72bc09ee7632"),
    "name" : "testdata",
    "createdBy" : "57f1fdef1d3c40141617d215",

    "transitionEnabled" : false,
    "status" : "active",
    "createdDateTime" : ISODate("2016-10-04T10:06:16.195Z"),
    "accounts" : [ 
        "57f37f75517f72bc09ee7634"
    ],
    "deliverables" : [],
    "risks" : [],
    "issues" : {
        "_id" : ObjectId("57f38398517f72bc09ee7680"),
        "title" : "test",
        "description" : "Delay in testing due to issues with Provider Finder dataload in the test region. This has impacted the production release planned for Sep 30th",
        "plannedStartDate" : ISODate("2016-09-01T00:00:00.000Z"),
        "plannedEndDate" : ISODate("2016-10-30T00:00:00.000Z"),
        "assignedTo" : "57f375ea517f72bc09ee762a",
        "createdBy" : ObjectId("57f375ea517f72bc09ee762a"),
        "likes" : 0,
        "createdDateTime" : ISODate("2016-10-04T10:25:28.301Z"),
        "status" : "open",
        "stakeholders" : [],
        "__v" : 0,
        "lastUpdatedTime" : ISODate("2019-11-15T09:19:06.279Z")
    },
    "__v" : 0
}

我想按组织选择所有问题组,我想对这些数据实施排序、限制和跳过(子数组仅从上面发布数据)。为此,我尝试了以下代码

db.organizations.aggregate([ { "$lookup" : { "from" : "issues", "localField" : "issues.str", "foreignField" : "_id.str", "as" : "issues" } }, {$sort: {weight: -1, "issues.lastUpdatedTime": 1}} { $group: { _id: "$issues", }, }, ])

我得到的结果如下。

如何对下面的查询进行排序和设置限制和跳过?查询返回的结果也附上。

但我不需要上面结果中显示的外部 _id 字段。请帮我解决这个问题。

【问题讨论】:

标签: node.js database mongodb


【解决方案1】:

您的sort 不适用于字段issues.lastUpdatedTime,因为issues$lookup 之后的对象数组,而不是普通对象。所以你需要先$unwind 然后申请sortsort 之后,您应该使用skiplimit。喜欢

{$unwind:"$issues"},
{$sort: {weight: -1, "issues.lastUpdatedTime": 1}},
{ $skip: 10 },// set value as you need 
{ $limit : 50 }// set value as you need 

注意:$limit 始终应该在 $skip 之后,对于 aggregation。所以代码会像

db.organizations.aggregate([
  {
    "$lookup": { "from": "issues", "localField": "issues.str", "foreignField": "_id.str", "as": "issues" }
  },
  {$unwind:"$issues"},
  {$sort: {weight: -1, "issues.lastUpdatedTime": 1}},
  {$skip: 10},
  {$limit: 50}
]);

注意:如果你想在分组后返回固定数量的文档,那么你应该使用$skip$limit anafter $group stage

【讨论】:

  • 应该可以工作。你得到了什么错误的数据?
  • 它没有对 lastUpdatedTime 的数据进行排序,并且在运行此查询后显示了整个记录。跳过和限制也不起作用。始终显示整个数据
  • 我想订购上图中显示的 _id 内的项目,并且我想对这些数据实施跳过和限制。
  • skiplimit 申请第一级文档而不是嵌套文档
  • 我想将嵌套数组元素(问题)移到外部,并为这些数组元素添加跳过和限制。有没有办法做到这一点?
【解决方案2】:

首先 $unwind 问题子数组并使用其结果可以应用排序、跳过和限制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多