使用 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 格式)和预期输出吗? 如果您想获得更好的视角,我可以发送包含所有信息的文件,因为信息量很大:) 您不需要发送整个文件,只需发送相关的最小部分即可。我们想知道usersposts 的结构。我已经在下面发布了答案,如果答案仍然不能解决您的问题,请添加评论:) 【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

java,如何将电话号码段批量插进数据库,希望高手能给个代码。

如何设置思科无线路由器?

将 2 个 SQL SELECT 结果集合并为一个

7条电信网线和2个4WAN口路由器如何叠加在一起

网络连接提示受限制或无连接怎么回事?

电脑插着无线网卡却连接不上怎么办