MongoDB - 查询引用 2 深的 ObjectID
MongoDB - query references 2 deep of ObjectIDs
我继承了一个带有 MongoDB API 的 Azure Cosmos 数据库。 “鉴别器”被广泛使用,因此一个集合有许多不同的模型。
我正在尝试根据文档 ID (ObjectId()) 深入查询文档的三个级别
父组
{
_id: ObjectId(),
__type: "ParentGroup",
name: "group 1",
subgroups: [
...ObjectIds,
],
}
子组
{
_id: ObjectId(),
__type: "SubGroup",
name: "a text name",
members: [
...ObjectIds,
],
}
会员
{
_id: ObjectId(),
__type: "Member",
name: "string",
email: "",
induction: Date,
}
我见过的处理嵌套文档而不是引用的示例
是否可以查询会员文件和return?
[
{
parentGroup,
subgroups: [
{sub group, members: [...members]},
{sub group, members: [...members]},
{sub group, members: [...members]},
]
},
]
阅读评论和进一步阅读后,我明白了。它几乎在那里,但我认为 MongoDB 的限制将阻止解决方案出现在单个查询中。目标是 return ParentGroups->Subgroups->Members 其中成员的“归纳”值是“随便”。我要么 return 所有 ParentGroups 要么什么都没有
db.development.aggregate([
{
$match: {
__type: "ParentGroup", $expr: {
$gt: [
{ $size: "$subgroups" }, 0
]
}
}
},
{
$lookup: {
from: "development",
localField: "subgroups",
foreignField: "_id",
as: "subgroups"
}
},
{
$unwind: {
path: "$subgroups",
// preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "development",
localField: "subgroups.members",
foreignField: "_id",
as: "subgroups.members"
}
}
])
对我有用的解决方案:
db.development.aggregate([
{
$match: {
__type: "ParentGroup",
},
},
{
$lookup: {
from: "development",
localField: "subgroups",
foreignField: "_id",
as: "subgroups",
},
},
{
$unwind: {
path: "$subgroups",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: "development",
localField: "subgroups.members",
foreignField: "_id",
as: "subgroups.activities_x",
},
},
{
$unwind: {
path: "$subgroups.members",
preserveNullAndEmptyArrays: true,
},
},
{
$match: { "subgroups.members.meta": { $exists: true } },
},
{
$project: {
_id: 1,
__type: 1,
name: 1,
subgroups: {
_id: 1,
__type: 1,
name: 1,
members: {
_id: 1,
__type: 1,
name: 1,
meta: 1,
},
},
},
},
]);
我继承了一个带有 MongoDB API 的 Azure Cosmos 数据库。 “鉴别器”被广泛使用,因此一个集合有许多不同的模型。
我正在尝试根据文档 ID (ObjectId()) 深入查询文档的三个级别
父组
{
_id: ObjectId(),
__type: "ParentGroup",
name: "group 1",
subgroups: [
...ObjectIds,
],
}
子组
{
_id: ObjectId(),
__type: "SubGroup",
name: "a text name",
members: [
...ObjectIds,
],
}
会员
{
_id: ObjectId(),
__type: "Member",
name: "string",
email: "",
induction: Date,
}
我见过的处理嵌套文档而不是引用的示例
是否可以查询会员文件和return?
[
{
parentGroup,
subgroups: [
{sub group, members: [...members]},
{sub group, members: [...members]},
{sub group, members: [...members]},
]
},
]
阅读评论和进一步阅读后,我明白了。它几乎在那里,但我认为 MongoDB 的限制将阻止解决方案出现在单个查询中。目标是 return ParentGroups->Subgroups->Members 其中成员的“归纳”值是“随便”。我要么 return 所有 ParentGroups 要么什么都没有
db.development.aggregate([
{
$match: {
__type: "ParentGroup", $expr: {
$gt: [
{ $size: "$subgroups" }, 0
]
}
}
},
{
$lookup: {
from: "development",
localField: "subgroups",
foreignField: "_id",
as: "subgroups"
}
},
{
$unwind: {
path: "$subgroups",
// preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "development",
localField: "subgroups.members",
foreignField: "_id",
as: "subgroups.members"
}
}
])
对我有用的解决方案:
db.development.aggregate([
{
$match: {
__type: "ParentGroup",
},
},
{
$lookup: {
from: "development",
localField: "subgroups",
foreignField: "_id",
as: "subgroups",
},
},
{
$unwind: {
path: "$subgroups",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: "development",
localField: "subgroups.members",
foreignField: "_id",
as: "subgroups.activities_x",
},
},
{
$unwind: {
path: "$subgroups.members",
preserveNullAndEmptyArrays: true,
},
},
{
$match: { "subgroups.members.meta": { $exists: true } },
},
{
$project: {
_id: 1,
__type: 1,
name: 1,
subgroups: {
_id: 1,
__type: 1,
name: 1,
members: {
_id: 1,
__type: 1,
name: 1,
meta: 1,
},
},
},
},
]);