首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与mongo中的另一个集合中的数据进行排序,使用nodejs进行一个2多个映射?

如何与mongo中的另一个集合中的数据进行排序,使用nodejs进行一个2多个映射?
EN

Stack Overflow用户
提问于 2020-08-11 13:05:39
回答 1查看 95关注 0票数 0

我在mongo DB有两个收藏品-

  1. 车辆
  2. 汽车销

在这里您可以下载集合的json - 下载

我想加入的股票和排序的描述计数,组按description.type。这意味着,UI中有一个名为损伤的列,如果我用这个字段进行排序,那么它将按照最高的损伤计数进行排序。你的帮助将不胜感激。

产出应该是这样的-

代码语言:javascript
复制
{
    "stockid": 62790,
    "condition": "Used",
    "vin": "WA1C4AFY1J2153426",
    "make": "Audi",
    "carYear": 2018,
    "carBody": "SUV",
    "model": "SQ5",
    "series": "3.0 TFSI Prestige",
    "mileage": 21861,
    "exteriorColor": "WHITE",
    "interiorColor": "DK RED",
    "fuelType": "Gasoline Fuel",
    "seating": "5",
    "listPrice": 35900,
    "damageCount": 5,
    "possibleFeatureCount": 1,
    "featureCount": 5
},
{
    "stockid": 62852,
    "condition": "Used",
    "vin": "WAU43AFD4HN017288",
    "make": "Audi",
    "carYear": 2017,
    "carBody": "Sedan",
    "model": "A8 L",
    "series": "4.0 TFSI Sport",
    "mileage": 32427,
    "exteriorColor": "WHITE",
    "interiorColor": "LT GRAY",
    "fuelType": "Gasoline Fuel",
    "seating": "5",
    "listPrice": 38900,
    "damageCount": 1,
    "possibleFeatureCount": 1,
    "featureCount": 2
},
{
    "stockid": 6740,
    "condition": "Used",
    "vin": "5TDKK3DC7GS751192",
    "make": "Toyota",
    "carYear": 2016,
    "carBody": "SUV",
    "model": "Sienna",
    "series": "5dr 7-Pass Van LE FWD",
    "mileage": 11111,
    "exteriorColor": "BLACK",
    "interiorColor": "LT GRAY",
    "fuelType": "Gasoline Fuel",
    "cylinder": "V6 Cylinder Engine",
    "seating": "7",
    "listPrice": 18900,
    "damageCount": 13,
    "possibleFeatureCount": 3,
    "featureCount": 3
}

EN

回答 1

Stack Overflow用户

发布于 2020-08-11 13:48:57

您可以使用聚集管道进行计算和排序。我建造了一条管道,我认为符合你的要求。

代码语言:javascript
复制
[
{$unwind: {
  path: "$description"
}}, 
{$group: {
  _id: "$stockId",
  description: {
    $push: "$description"
  }
}}, 
{$lookup: {
  from: 'vehicles',
  localField: '_id',
  foreignField: 'stockid',
  as: 'vehicleInfo'
}}, 
{$addFields: {
  damageCount: {
    $size: {
      $filter: {
        input: '$description',
        as: 'desc',
        cond: {
          $eq: [
            '$$desc.type',
            'DAMAGE'
          ]
        }
      }
    }
  }
}}, 
{$sort: {
  damageCount: -1
}}
]

管道所做的第一件事是展开描述数组。我这么做是因为同一个牛仔可能会出现好几次。

然后,$group阶段基于stockid对文档进行分组。原始描述数组中的所有项都被推送到新的描述字段中。

$lookup阶段加入vehicles集合和stockId上的vehicle-pins集合。这个阶段将来自vehicles集合的信息放在一个名为vehicleInfo的数组中。

$addFields阶段为每个名为damageCount的文档添加了一个字段,该字段计算描述中有多少元素的类型等于DAMAGE

$sort阶段按新的damageCount字段按降序排序文档。

我在MongoDB地图集中包含了管道下面的截图,这样你就可以看到每个阶段都发生了什么。

注意:当我将您的文档导入Atlas时,两个集合中的股票类型并不相同。其中一个是字符串型的,另一个是int32型的。$lookup阶段没有工作,直到我使他们所有的类型。如果不想更新文档本身,可以在管道中添加一个阶段来执行转换:$toInt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63358783

复制
相关文章

相似问题

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