我目前在 node.js 中使用下面的代码从 mongo 数据库中查找并返回各种嵌套级别的数据。我想添加另一层嵌套(如 #3 中所述)。
收藏:
[
{
"title": "Category A",
"link": "a",
"items": [
{
"title": "Item C",
"link": "a-c",
"series": [
{
"title": "Item C X",
"link": "a-c-x"
},
{
"title": "Item C Y",
"link": "a-c-y"
},
]
},
{
"title": "Item D",
"link": "a-d"
}
]
},
{
"title": "Category B",
"link": "b"
}
]
查询:
const doc = await ... .findOne(
{
$or: [
{ link: id },
{ "items.link": id },
{ "items.series.link": id }
],
},
{
projection: {
_id: 0,
title: 1,
link: 1,
items: { $elemMatch: { link: id } },
},
}
);
预期结果:
(有效)如果
link文档匹配,
(有效)应该只返回一个带有标题和链接的对象,
例如
id 变量的值:"a"
预期的查询结果:{ title: "Category A", link: "a"}(有效)如果
items.link子文档匹配,
(有效)它应该与上面相同 + 返回的 items 数组中的附加元素。
例如
id 变量的值:"a-c"
预期的查询结果:{ title: "Category A", link: "a", items: [{ title: "Item C", link: "a-c" }]}(有效)如果
items.series.link匹配子子文档
(为此苦苦挣扎),它应该返回与 2 中相同的结果。 + 匹配内的附加元素,items.series
例如
id 变量的值:"a-c-y"
预期查询结果:{ title: "Category A", link: "a", items: [{ title: "Item C", link: "a-c", series: [{ title: "Item C Y", link: "a-c-y" }]}]}
当前查询结果:整个 A 类文档与所有子文档
问题:
a.) 如何修改投影以在#3 中也返回预期的输出?
b.) 就非规范化结构的读取速度而言,上述方法是否合理?我认为可能需要在链接、items.link 和 items.series.link 上建立索引,因为它们在文档中都是完全唯一的,但也许有一种方法可以用完全不同的方法实现上述目标?