【问题标题】:MongoDB - findOne with nested subdocuments and projectionMongoDB - 带有嵌套子文档和投影的 findOne
【发布时间】: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 } },
        },
    }
);

预期结果:

  1. (有效)如果文档的link 匹配,
    (作品)应该只返回一个带有标题和链接的对象
    例如
    id 变量的值:"a"
    预期查询结果:{ title: "Category A", link: "a"}

  2. (有效)如果子文档的items.link 匹配,
    (有效)它应该与上面相同 + 返回的 items 数组中的附加元素。
    例如
    id 变量的值:"a-c"
    预期查询结果:{ title: "Category A", link: "a", items: [{ title: "Item C", link: "a-c" }]}

  3. (有效)如果子子文档的 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 值或aa-ca-c-y 传递给匹配/过滤器中的所有字段(linkitems.linkitems.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


【解决方案1】:

最终通过 mongodb 中途获取两者的完整项目 - 当项目链接匹配且系列链接匹配时:

projection: {
  _id: 0,
  title: 1,
  link: 1,
  items: { $elemMatch: { $or: [
    { link: id },
    {"series.link": id }
  ]}},
}

之后 javascript 过滤系列数组以查看系列是否匹配:

doc?.items?.[0]?.series?.find(item => item.link === id)

如果js是真的(返回一个对象)我们匹配一个系列,如果有一个文档,但js是假的我们匹配一个项目结果。

虽然不是一个完整的 mongodb 解决方案,而且肯定有改进的余地,但上述似乎实现了能够区分类别、项目和系列结果的最终目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2016-02-14
    • 2021-08-28
    相关资源
    最近更新 更多