将对象数组转换为 mongodb 中的字符串数组
Convert array of objects to array of strings in mongodb
我正在查看以下documentation。
以下将文档插入集合 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"
}
}
] )
其中returns以下:
{
"_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"
]
}
我还通过在 $lookup
操作中引入 pipeline
字段来研究使用多重连接。我可以使用 $project
仅通过 {"name": "example"}
获取数组,但我不确定如何删除 "name"
。我试过使用 {"$unwind": "$enrollee_info.name"}
但这并没有给我想要的东西。我是否需要在我的聚合管道中引入另一个阶段在我进行连接之后?
看来我把这个复杂化了。通过执行以下操作,我能够达到我想要的结果:
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"
],
"names": [
"artie",
"pandabear",
"giraffe2"
]
},
{
"id": 2,
"title": "But Writing ...",
"days": [
"T",
"F"
],
"names": [
"artie",
"giraffe1"
]
}
]
我正在查看以下documentation。
以下将文档插入集合 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"
}
}
] )
其中returns以下:
{
"_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"
]
}
我还通过在 $lookup
操作中引入 pipeline
字段来研究使用多重连接。我可以使用 $project
仅通过 {"name": "example"}
获取数组,但我不确定如何删除 "name"
。我试过使用 {"$unwind": "$enrollee_info.name"}
但这并没有给我想要的东西。我是否需要在我的聚合管道中引入另一个阶段在我进行连接之后?
看来我把这个复杂化了。通过执行以下操作,我能够达到我想要的结果:
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"
],
"names": [
"artie",
"pandabear",
"giraffe2"
]
},
{
"id": 2,
"title": "But Writing ...",
"days": [
"T",
"F"
],
"names": [
"artie",
"giraffe1"
]
}
]