发布
社区首页 >问答首页 >聚合管道中的文档过滤、映射和排序

聚合管道中的文档过滤、映射和排序
EN

Stack Overflow用户
提问于 2021-01-15 07:53:41
回答 2查看 77关注 0票数 0

假设我有一个聚合管道,我可以根据需要获得所需的详细信息,但我需要按降序排序名为visits的键的值,然后在其中选择条目。

代码语言:javascript
代码运行次数:0
复制
                {
                    $match: {
                        mobile_number: "1234567890",
                    }
                },
                {
                    $lookup: {
                        from: "visitor_logs",
                        localField: "_id",
                        foreignField: "visitor_id",
                        as: "visits",
                    }
                },
                {
                    $project: {
                        _id: 0,
                        visitor_id: "$_id",
                        first_name: "$first_name",
                        last_name: "$last_name",
                        mobile_number: "$mobile_number",
                        visits: {
                            $filter: {
                                input: "$visits",
                                as: "visit",
                                cond: {
                                    $and: [
                                        {$gte: ["$$visit.in_time", "1610609615"]},
                                        {$lte: ["$$visit.in_time", "1610615328"]},
                                    ]
                                }
                            },
                        },
                    }
                },
            ]);

样品响应

代码语言:javascript
代码运行次数:0
复制
{
    "type": "SUCCESS",
    "log": [
        {
            "visitor_id": "5ffff1354351be2c600c4f94",
            "first_name": "Ayan",
            "last_name": "Dey",
            "mobile_number": "1234567890",
            "visits": [
                {
                    "_id": "5ffff3df82dc1a0e90d89a5c",
                    "in_time": "1610609615",
                    "out_time": "1610609671",
                    "checked_in_status": false,
                    "visitor_id": "5ffff1354351be2c600c4f94",
                    "visit_purpose": "Test",
                    "person_to_meet": "Someone new",
                    "__v": 0
                },
                {
                    "_id": "5ffff41a82dc1a0e90d89a5d",
                    "in_time": "1610609615",
                    "out_time": "1610609730",
                    "checked_in_status": false,
                    "visitor_id": "5ffff1354351be2c600c4f94",
                    "visit_purpose": "Test",
                    "person_to_meet": "Someone new",
                    "__v": 0
                },
                {
                    "_id": "5ffff45a82dc1a0e90d89a5e",
                    "in_time": "1610609615",
                    "out_time": "1610609919",
                    "checked_in_status": false,
                    "visitor_id": "5ffff1354351be2c600c4f94",
                    "visit_purpose": "Test",
                    "person_to_meet": "Someone new",
                    "__v": 0
                }
            ]
        }
    ]
}

现在,我要寻找的是基于visits按降序排列_id字段。我的意思是,在visits中只选择特定的项目。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-15 09:46:35

希望您已经解决了,这可能对您有所帮助,请尝试用管道查找

  • let通过本地字段,管道将条件放置在$match阶段,过滤条件在$project阶段不需要过滤。并将排序按_id降序排列
代码语言:javascript
代码运行次数:0
复制
  { $match: { mobile_number: "1234567890", } },
  {
    $lookup: {
      from: "visitor_logs",
      let: { visitor_id: "$_id" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$$visitor_id", "$visitor_id"] },
            in_time: {
              $gte: "1610609615",
              $lte: "1610615328"
            }
          }
        },
        { $sort: { _id: -1 } },
        {
          $project: {
            _id: 0,
            v_id: "$_id",
            in_time: 1,
            out_time: 1,
            checked_in_status: 1,
            visit_purpose: 1,
            person_to_meet: 1
          }  
        }
      ],
      as: "visits"
    }
  },
  {
    $project: {
      _id: 0,
      visitor_id: "$_id",
      first_name: 1,
      last_name: 1,
      mobile_number: 1,
      visits: 1
    }
  }
票数 1
EN

Stack Overflow用户

发布于 2021-01-15 08:20:09

其中一种方法是使用unwind -

代码语言:javascript
代码运行次数:0
复制
db.collection.aggregate([
  {//de-normalize
    "$unwind": "$log"
  },
  {//de-normalize
    "$unwind": "$log.visits"
  },
  {//sort
    "$sort": {
      "log.visits._id": -1
    }
  }
])

然后,您可以根据您的摘樱桃逻辑添加$match$project

在采摘樱桃之后,您可以使用$group将数据重塑为问题婴儿中的格式。

您可以再次按抽样这里进行分组。

代码语言:javascript
代码运行次数:0
复制
 {
    $group: {
      _id: "$categoryData._id",
      count: {
        $sum: 1
      },
      total_price: {
        $sum: "$asset_price"
      }
    }
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65732364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档