繁体   English   中英

如何将多个文档中的数组字段合并到MongoDB中的单个输出数组中,并将mongoexport合并到csv中

[英]How to merge an array field in multiple documents into a single output array in MongoDB and mongoexport to csv

我有一个MongoDB集合,Groups。 每个组都有一个成员数组,由成员的唯一ID引用。 用户可以是许多组的成员。

组数据如下所示:

{ _id: 1, members: ['1', '3', '5'], status: 'active' }
{ _id: 2, members: ['4', '1', '10', '11'], status: 'inactive' }
{ _id: 3, members: ['1', '2', '9'], status: 'active' }

我试图将活动组的所有成员提取为单个成员ID数组,而不重复。 我想使用mongoexport将它们导出到csv文件。

我可以导出相关项目的ID及其成员列表:

mongoexport -h localhost:3001 --db mydbname --collection groups --type=csv --fields _id,members --query '{"status": "active"}' --out mongotestoutput.txt

但我无法弄清楚如何将成员列表合并到一个数组中。 我一直在关注聚合,但我只是迷失在所有不同的选项中,我无法看到哪一个会做我需要的。 非常感谢任何帮助。

使用$unwind聚合然后$out创建一个看起来像你需要的新集合。 然后将此新集合导出到CSV文件。

db.test1.insertMany([
  { _id: 1, members: ['1', '3', '5'], status: 'active' },
  { _id: 2, members: ['4', '1', '10', '11'], status: 'inactive' },
  { _id: 3, members: ['9'], status: 'active' }
])

{_id:0}此处和下面用于抑制_id字段

db.test1.aggregate([
  {$unwind: "$members"},
  {$project:{_id:0}},
  {$out:"test2"}
])


db.test2.find({},{_id:0})
{ "members" : "1", "status" : "active" }
{ "members" : "3", "status" : "active" }
{ "members" : "5", "status" : "active" }
{ "members" : "4", "status" : "inactive" }
{ "members" : "1", "status" : "inactive" }
{ "members" : "10", "status" : "inactive" }
{ "members" : "11", "status" : "inactive" }
{ "members" : "9", "status" : "active" }

或者,如果您需要在数组中按状态获取成员 - 添加另一个$group$addToSet阶段:

db.test1.aggregate([
  {$unwind: "$members"},
  {$project:{_id:0}},
  { "$group": { "_id": "$status", members:{$addToSet:"$members"} } },
  {$out:"test3"}
])

db.test3.find()
{ "_id" : "inactive", "members" : [ "4", "1", "10", "11" ] }
{ "_id" : "active", "members" : [ "1", "3", "5", "9" ] }

MongoPlayground

这个问题显示了两种获得我正在寻找的结果的方法。 接受的答案使用push,reduce和setUnion。 使用unwind和addToSet,更新的答案更简单。 两者都适合我,但我会使用更简单的版本:

db.collection.aggregate([
  { $match: { "status": "active" },
  { $unwind: "$members"},
  { $group:{
     _id: 0,
     selectedMembers: { $addToSet: '$members' }      
  }}
])

我正在从这个表达式返回的JSON对象中提取我想要的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM