展开对象数组但保留其父级

Unwind object array but preserve its parent

我想展开一些数据,但保留父数据。我得到了整个扁平化的对象,但缺少第一个。我想保留那个。我怎么能做这样的事?

我的文档:

    [
      {
        "key": 1,
        "keys": [
          {
            key: 3
          },
          {
            key: 4
          },
          {
            key: 5
          },
          
        ]
      },
      {
        "key": 2
      }
    ]

执行此操作后:

db.collection.aggregate([
  {
    "$match": {},
    
  },
  {
    "$unwind": {
      path: "$keys",
      preserveNullAndEmptyArrays: true,
      
    }
  },
  {
    "$replaceWith": {
      "$mergeObjects": [
        "$$ROOT",
        "$keys"
      ]
    }
  }
])

我得到这个:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "key": 3,
    "keys": {
      "key": 3
    }
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "key": 4,
    "keys": {
      "key": 4
    }
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "key": 5,
    "keys": {
      "key": 5
    }
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "key": 2
  }
]

但应该是这样的:

{ key: 1},
{ key: 2},
{ key: 3},
{ key: 4},
{ key: 5},

这可能实现吗?这有可能用大数据来完成吗($group stage 让我内存溢出)?

查询

  • 在键数组中添加键(如果键不是数组,键将以[]开头)
  • 展开密钥
  • replaceRoot
  • 排序

PlayMongo

aggregate(
[{"$set": 
   {"keys": 
     {"$concatArrays": 
       [{"$cond": [{"$isArray": ["$keys"]}, "$keys", []]},
         [{"key": "$key"}]]}}},
 {"$unwind": "$keys"},
 {"$replaceRoot": {"newRoot": "$keys"}},
 {"$sort": {"key": 1}}])