Node.js 将单独集合中的引用文档移动到原始集合mongodb中

Node.js 将单独集合中的引用文档移动到原始集合mongodb中,node.js,mongodb,Node.js,Mongodb,我有一个引用另一个集合的现有集合,然后在查询数据库时填充该集合。我改变了主意,现在只想将这些文件嵌入原始收藏中。有没有一种方法可以通过编程来实现这一点 以下是我所拥有的: events: [{ _id '38e88a8c8323...', items: [ { ObjectID: '5e0f39e0d90a09c...'} ] }] items: [{ _id: '5e0f39e0d90a09c...', name: 'Example' }] 以下是我想要的: ev

我有一个引用另一个集合的现有集合,然后在查询数据库时填充该集合。我改变了主意,现在只想将这些文件嵌入原始收藏中。有没有一种方法可以通过编程来实现这一点

以下是我所拥有的:

events: [{
  _id '38e88a8c8323...',
  items: [
    { ObjectID: '5e0f39e0d90a09c...'}
  ]
}]
items: [{
  _id: '5e0f39e0d90a09c...',
  name: 'Example'
}]
以下是我想要的:

events: [{
  _id '38e88a8c8323...',
  items: [
     {
        _id: '5e0f39e0d90a09c...',
        name: 'Example'
     }
  ]
}

您可以使用
$unwind
$lookup
管道执行聚集

db.events.aggregate([
  {
    $unwind: "$items"
  },
  {
    $lookup: {
      from: "items",
      localField: "items.ObjectID",
      foreignField: "_id",
      as: "items"
    }
  },
  {
    $group: {
      _id: "$_id",
      items: {
        $push: {
          $arrayElemAt: [
            "$items",
            0
          ]
        }
      }
    }
  },
  {
    $merge:{
      into : "tmp",
      on : "_id", 
      whenMatched : "replace",
      whenNotMatched : "insert"
    }
  }
])


编辑:它将创建
tmp
集合。只需删除
events
并将
tmp
重命名为
events

FWIW,我最终使用了$lookup和$out,因为$merge在我使用的Mongodb版本中不可用($merge在v4.2中可用)


这将其直接保存到事件中,因此我不必创建临时集合并重命名

,谢谢,但我希望以这种方式将其保存到数据库中,然后删除已更新的项目集合(因为它们嵌入到事件集合中)。您可以添加为最后一个管道,并将结果插入tmp集合
db.events.aggregate([
  {'$lookup': {
       'from':'items', 
       'localField':'items',
       'foreignField':'_id',
       'as':'items'
  }},{'$out':'events'}])