使用 javascript 将 2 个连接的集合插入到新集合 MongoDB
Posted
技术标签:
【中文标题】使用 javascript 将 2 个连接的集合插入到新集合 MongoDB【英文标题】:Insert a 2 joined collections to a new collection MongoDB with javascript 【发布时间】:2020-08-24 23:57:37 【问题描述】:我正在尝试将两个集合加入一个新集合,同时将结果插入新集合。
我用于连接的代码:
db.users.aggregate(
[
$lookup:
from: "posts",
localField: "_id",
foreignField: "_uid",
as: "postsByUser"
])
我知道这会返回一个新的集合/数组 现在,我可以像这样将这个新数组插入到一个新集合中:
db.postsByUsers.insert(db.users.aggregate(
[
$lookup:
from: "posts",
localField: "_id",
foreignField: "_uid",
as: "postsByUser"
]))
但我进入“postsByUsers”集合的结果并不是我所期望的。
我得到了很多额外的字段,例如:_useReadCommands、_cursorid、_batchSize 等。
我确实在名为 _batch 的字段中获得了我需要的信息,但它不像我预期的那样干净,我希望它看起来像一个数组,其中包含对象 + 最后的 postsByUser 字段将为我提供所有信息。当我尝试设置一个var
usersPosts 来测试这个时,它等于我所做的连接编码并循环遍历它,对于每个文档:db.postsByUsers.insert(usersPosts)
,这似乎什么都不做:
usersPosts.forEach(function(doc)
db.postsByUsers.insertOne(doc)
)
我确实设法得到我想要的结果但我不知道为什么(奇怪)的奇怪事情,我试图通过按 cmd bv 上的向上键来查看我编写的代码但似乎什么都没有给我同样的结果...请帮助并非常感谢您阅读!
【问题讨论】:
您能分享一下架构、当前输出(json 格式)和预期输出吗? 如果您想获得更好的视角,我可以发送包含所有信息的文件,因为信息量很大:) 您不需要发送整个文件,只需发送相关的最小部分即可。我们想知道users
和posts
的结构。我已经在下面发布了答案,如果答案仍然不能解决您的问题,请添加评论:)
【参考方案1】:
您可以使用$out聚合管道阶段将聚合管道的结果输出到另一个集合中
$out: 'postsByUsers'
从 MongoDB 4.2 开始,您还可以使用$merge,它更灵活,可以将结果文档与现有文档合并。
【讨论】:
感谢您的回复!你能更具体地说明我应该把 $out: 'postsByUsers' 放在哪里 db.users.aggregate( [ $lookup: from: "posts", localField: "_id", foreignField: "_uid", as : "postsByUser" ]) 请查阅我参考的文档。它应该放在你聚合的最后阶段,即.aggregate([ $lookup: ... , $out: ... ])
天哪,它确实奏效了,非常感谢你的大力帮助,我被困在这个问题上太久了!希望你有一个美好的白天/夜晚!以上是关于使用 javascript 将 2 个连接的集合插入到新集合 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章