mongodb 用于从多个嵌套文档属性创建值列表的聚合管道
mongodb Aggregation Pipeline to create a list of values from multiple nested document properties
我有两个集合,db.items 和 db.data,格式如下:
// db.items document (configuration-level information such as name, settings, user, etc.)
{
_id: #id,
...
}
// db.data document (data for the a configuration)
{
...,
item: #id, // reference to _id of db.item doc
grouping_1: [
{ name: "A", item: "ObjectId()" },
{ name: "B", item: "ObjectId()" }
],
grouping_2: [
{ name: "C", item: "ObjectId()" },
{ name: "D", item: "ObjectId()" }
]
}
我似乎无法弄清楚如何使用 Aggregation Pipeline 为 db.item 文档提供 db.data "name" 道具列表。
// db.items document desired result
{
_id: #id,
names: ["A", "B", "C", "D"],
...
}
查询如 db.data.find( { item: #id }, { _id: 0, "grouping_1.name": 1, "grouping_2.name": 1 } )
由于某种原因 return 设置为这样 { "grouping_1": [ { "name": "A" }, { "name": "B" } ], "grouping_2" : [ { "name": "C" }, { "name", "D" } ] }
我希望看到同时使用 shell 和 C# 驱动程序 (2.10) 的实现;但是,如果您只能提供 one/that 的太多要求,我会很乐意接受任何一个。
编辑:
我在考虑将我的架构重组为这样的东西可能会使更多 sense/be 更容易使用。
{
...,
grouping_1: {
"A": "ObjectId()",
"B": "ObjectId()"
},
grouping_2: {
"C": "ObjectId()",
"D": "ObjectId()"
}
}
编辑 2:
对于任何具有我在第一次编辑中建议的模式的人,here's the solution!
我相信这条管道将为您带来预期的结果:
db.Item.aggregate([
{
$match: {
_id: ObjectId("5e6f98e41b70ea2c14c208b9")
}
},
{
$lookup: {
from: "Data",
localField: "_id",
foreignField: "item",
as: "data"
}
},
{
$project: {
names: {
$map: {
input: {
$concatArrays: [
{ $arrayElemAt: ["$data.grouping_1", 0] },
{ $arrayElemAt: ["$data.grouping_2", 0] }]
},
in: '$$this.name'
}
}
}
}
])
https://mongoplayground.net/p/H3Q3N0-P9JB
这里有一个 good way 用于在 c#
中执行此管道
我有两个集合,db.items 和 db.data,格式如下:
// db.items document (configuration-level information such as name, settings, user, etc.)
{
_id: #id,
...
}
// db.data document (data for the a configuration)
{
...,
item: #id, // reference to _id of db.item doc
grouping_1: [
{ name: "A", item: "ObjectId()" },
{ name: "B", item: "ObjectId()" }
],
grouping_2: [
{ name: "C", item: "ObjectId()" },
{ name: "D", item: "ObjectId()" }
]
}
我似乎无法弄清楚如何使用 Aggregation Pipeline 为 db.item 文档提供 db.data "name" 道具列表。
// db.items document desired result
{
_id: #id,
names: ["A", "B", "C", "D"],
...
}
查询如 db.data.find( { item: #id }, { _id: 0, "grouping_1.name": 1, "grouping_2.name": 1 } )
由于某种原因 return 设置为这样 { "grouping_1": [ { "name": "A" }, { "name": "B" } ], "grouping_2" : [ { "name": "C" }, { "name", "D" } ] }
我希望看到同时使用 shell 和 C# 驱动程序 (2.10) 的实现;但是,如果您只能提供 one/that 的太多要求,我会很乐意接受任何一个。
编辑: 我在考虑将我的架构重组为这样的东西可能会使更多 sense/be 更容易使用。
{
...,
grouping_1: {
"A": "ObjectId()",
"B": "ObjectId()"
},
grouping_2: {
"C": "ObjectId()",
"D": "ObjectId()"
}
}
编辑 2: 对于任何具有我在第一次编辑中建议的模式的人,here's the solution!
我相信这条管道将为您带来预期的结果:
db.Item.aggregate([
{
$match: {
_id: ObjectId("5e6f98e41b70ea2c14c208b9")
}
},
{
$lookup: {
from: "Data",
localField: "_id",
foreignField: "item",
as: "data"
}
},
{
$project: {
names: {
$map: {
input: {
$concatArrays: [
{ $arrayElemAt: ["$data.grouping_1", 0] },
{ $arrayElemAt: ["$data.grouping_2", 0] }]
},
in: '$$this.name'
}
}
}
}
])
https://mongoplayground.net/p/H3Q3N0-P9JB
这里有一个 good way 用于在 c#
中执行此管道