合并数组中的两个对象,其中一个对象的键嵌套比另一个对象更深,位于 Mongo DB 的同一文档中

Posted

技术标签:

【中文标题】合并数组中的两个对象,其中一个对象的键嵌套比另一个对象更深,位于 Mongo DB 的同一文档中【英文标题】:Merge two objects inside an array, one with a key nested deeper than the other in the same document in Mongo DB 【发布时间】:2021-06-16 05:44:50 【问题描述】:

文档架构

id是加入的关键

 
    "foo" : [
        
            "properties" : 
                "id" : 1
            , 
        , 
        
            "properties" : 
                "id" : 2
            , 
        ], 
    "bar" : [
        
            "id" : 1,
            "metadata" : abc 
        ,
        
            "id" : 2,
            "metadata" : def 
        
    ]

目标

  
    "foo" : [
        
            "properties" : 
                "id" : 1,
                "metadata" : abc 
            , 
        , 
        
            "properties" : 
                "id" : 2,
                "metadata" : def 
            , 
        , 

【问题讨论】:

【参考方案1】:

您可以在架构上使用 $lookup,并在 $unwind 和 $project 的帮助下获得所需的结果。

查询:

db.foo.aggregate(
  $lookup: 
    from: "bar",
    localField: "properties.id",
    foreignField: "id",
    as: "properties"
  ,
  
,

  $unwind: 
    path: "$properties",
    
  
,

  $project: 
    _id: 0,
    properties: 1
  
)

输出:

[
  
    "properties": 
      "_id": ObjectId("5a934e000102030405000000"),
      "id": 1,
      "metadata": "abc"
    
  ,
  
    "properties": 
      "_id": ObjectId("5a934e000102030405000001"),
      "id": 2,
      "metadata": "def"
    
  
]

【讨论】:

以上是关于合并数组中的两个对象,其中一个对象的键嵌套比另一个对象更深,位于 Mongo DB 的同一文档中的主要内容,如果未能解决你的问题,请参考以下文章

将两个数组(键和值)合并为一个对象[重复]

将嵌套对象转换为数组

如果第二个数组的项目包含数组的第一个对象的 id,则合并 Angular 8 中的两个对象数组

合并嵌套在数组 mongoose 中的对象内的 $lookup 值

Swift:如果数组的自定义对象元素具有相同的键,则合并它们

无法根据另一个对象数组过滤对象数组