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
重命名为eventsFWIW,我最终使用了$lookup和$out,因为$merge在我使用的Mongodb版本中不可用($merge在v4.2中可用)
这将其直接保存到事件中,因此我不必创建临时集合并重命名,谢谢,但我希望以这种方式将其保存到数据库中,然后删除已更新的项目集合(因为它们嵌入到事件集合中)。您可以添加为最后一个管道,并将结果插入tmp集合
db.events.aggregate([
{'$lookup': {
'from':'items',
'localField':'items',
'foreignField':'_id',
'as':'items'
}},{'$out':'events'}])