将对象数组转换为 mongodb 中的字符串数组

问题描述 投票:0回答:1

我正在查看以下文档

以下将文档插入集合中

classes

db.classes.insertMany( [
   { _id: 1, title: "Reading is ...", enrollmentlist: [ "giraffe2", "pandabear", "artie" ], days: ["M", "W", "F"] },
   { _id: 2, title: "But Writing ...", enrollmentlist: [ "giraffe1", "artie" ], days: ["T", "F"] }
] )

还有

members
系列:

db.members.insertMany( [
   { _id: 1, name: "artie", joined: new Date("2016-05-01"), status: "A" },
   { _id: 2, name: "giraffe", joined: new Date("2017-05-01"), status: "D" },
   { _id: 3, name: "giraffe1", joined: new Date("2017-10-01"), status: "A" },
   { _id: 4, name: "panda", joined: new Date("2018-10-11"), status: "A" },
   { _id: 5, name: "pandabear", joined: new Date("2018-12-01"), status: "A" },
   { _id: 6, name: "giraffe2", joined: new Date("2018-12-01"), status: "D" }
] )

他们使用以下聚合来连接数组字段上的两个集合,

enrollmentlist

db.classes.aggregate( [
   {
      $lookup:
         {
            from: "members",
            localField: "enrollmentlist",
            foreignField: "name",
            as: "enrollee_info"
        }
   }
] )

返回以下内容:

{
   "_id" : 1,
   "title" : "Reading is ...",
   "enrollmentlist" : [ "giraffe2", "pandabear", "artie" ],
   "days" : [ "M", "W", "F" ],
   "enrollee_info" : [
      { "_id" : 1, "name" : "artie", "joined" : ISODate("2016-05-01T00:00:00Z"), "status" : "A" },
      { "_id" : 5, "name" : "pandabear", "joined" : ISODate("2018-12-01T00:00:00Z"), "status" : "A" },
      { "_id" : 6, "name" : "giraffe2", "joined" : ISODate("2018-12-01T00:00:00Z"), "status" : "D" }
   ]
}
{
   "_id" : 2,
   "title" : "But Writing ...",
   "enrollmentlist" : [ "giraffe1", "artie" ],
   "days" : [ "T", "F" ],
   "enrollee_info" : [
      { "_id" : 1, "name" : "artie", "joined" : ISODate("2016-05-01T00:00:00Z"), "status" : "A" },
      { "_id" : 3, "name" : "giraffe1", "joined" : ISODate("2017-10-01T00:00:00Z"), "status" : "A" }
   ]
}

如何将

enrolle_info
简化为包含所有
name
的字符串数组?

这就是我追求的结果:

{
   "_id" : 1,
   "title" : "Reading is ...",
   "enrollmentlist" : [ "giraffe2", "pandabear", "artie" ],
   "days" : [ "M", "W", "F" ],
   "enrollee_info" : [
      "artie",
      "pandabear"
      "giraffe2"
   ]
}
{
   "_id" : 2,
   "title" : "But Writing ...",
   "enrollmentlist" : [ "giraffe1", "artie" ],
   "days" : [ "T", "F" ],
   "enrollee_info" : [
      "artie",
      "giraffe1"
   ]
}

我还通过在

pipeline
操作中引入
$lookup
字段来研究使用多个联接。我可以使用
$project
来获取仅包含
{"name": "example"}
的数组,但我不知道如何删除
"name"
。我尝试过使用
{"$unwind": "$enrollee_info.name"}
但这并没有给我我想要的。在进行连接之后,我是否需要在聚合管道中引入另一个阶段?

mongodb aggregation-framework aggregation
1个回答
8
投票

db.classes.aggregate( [ { $lookup: { from: "members", localField: "enrollmentlist", foreignField: "name", as: "enrollee_info" } }, { $project: { "_id": 1, "title": 1, "days": 1, "enrollee_names": "$enrollee_info.name" } } ] )

结果:

[ { "id": 1, "title": "Reading is ...", "days": [ "M", "W", "F" ], "enrollee_names": [ "artie", "pandabear", "giraffe2" ] }, { "id": 2, "title": "But Writing ...", "days": [ "T", "F" ], "enrollee_names": [ "artie", "giraffe1" ] } ]

© www.soinside.com 2019 - 2024. All rights reserved.