【发布时间】:2020-10-06 22:28:29
【问题描述】:
我目前正在使用 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 上建立索引,因为它们在文档中都是完全独一无二的,但也许有一种方法可以用完全不同的方法实现上述目标?
【问题讨论】:
-
你能用示例文档/输入和所需的o/p来编辑这个问题吗?
-
@whoami - 编辑了描述并添加了示例集合,这是您的想法吗?
-
您是否将相同的
id值或a或a-c或a-c-y传递给匹配/过滤器中的所有字段(link、items.link、items.series.link)阶段 ?还是不同的id基于字段不同?我也能看到!!因此,如果您有id = a-c-y,那么您将永远无法获得main doc + items array + series array with a-c-y object,因为首先我们需要过滤items数组然后series数组(当我们过滤项目数组时,没有对象将与a-c-y匹配留空items数组,此后没有序列数组可操作) -
如果是这样的话,那么它似乎不可行..
-
到了显示系列数组的地步 - 项目和系列。猜猜剩下的工作现在将通过js完成。
标签: node.js mongodb projection