【问题标题】:how to get the two collections data into one output in mongodb using node js如何使用节点 js 将两个集合数据转换为 mongodb 中的一个输出
【发布时间】:2021-04-15 17:15:13
【问题描述】:

这是我在 MongoDB 中的两个集合,当我使用 $lookup 获取详细信息时,我的结果带有一个嵌套数组。我需要结果如下:

第一次收藏

locations = [{
  locationName : "DC",
  locationCategoryCode:"1"
}, {
  locationName : "New York",
  locationCategoryCode:"1"
}, {
  locationName : "Utah",
  locationCategoryCode:"2"
}]

第二次收集

locationCategory = [{
  locationCategoryCode:"1",
  locationCategoryName:"history"
}, {
  locationCategoryCode:"2",
  locationCategoryName:"nature"
}]

结果

result = [{
  locationName : "DC",
  locationCategoryName:"history"
}, {
  locationName : "NewYork",
  locationCategoryName:"history"
}]

请问有什么解决办法吗?

【问题讨论】:

    标签: javascript node.js mongodb collections


    【解决方案1】:

    使用聚合可以:

    • $查找类别,返回一个数组
    • $addFields 将类别名称添加到顶级文档
    • $project 删除添加的数组和位置代码
    db.locations.aggregate([
      {$lookup: {
          from: "locationCategory",
          localField: "locationCategoryCode",
          foreignField: "locationCategoryCode",
          as: "locationCategory"
      }},
      {$addFields: {
          locationCategoryName: {
            $arrayElemAt: ["$locationCategory.locationCategoryName",0]
          }
      }},
      {$project: {
          locationCategory: 0,
          locationCategoryCode: 0
      }}
    ])
    

    Playground

    【讨论】:

    • 这帮助我开发了我正在寻找的最终结果。非常感谢您的帮助
    【解决方案2】:

    您可以通过使用locationCategoryCode 搜索locationCategory 来找到每个location 的关联locationCategoryName

    const locations = [{
      locationName: "DC",
      locationCategoryCode: "1"
    }, {
      locationName: "New York",
      locationCategoryCode: "1"
    }, {
      locationName: "Utah",
      locationCategoryCode: "2"
    }];
    
    const locationCategory = [{
      locationCategoryCode: "1",
      locationCategoryName: "history"
    }, {
      locationCategoryCode: "2",
      locationCategoryName: "nature"
    }];
    
    const result = locations
      .map(({ locationName, locationCategoryCode }) => ({
        locationName,
        locationCategoryName: locationCategory.find(({ locationCategoryCode: curr }) =>
          curr === locationCategoryCode).locationCategoryName
      }));
    
    console.log(result);
    .as-console-wrapper { top: 0; max-height: 100% !important; }

    【讨论】:

      猜你喜欢
      • 2015-10-07
      • 2019-08-03
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2020-07-21
      • 2013-09-30
      • 2018-08-16
      相关资源
      最近更新 更多