【问题标题】:MongoDB - Mongoose find command to get only values from an embedded objectMongoDB - Mongoose find 命令仅从嵌入式对象中获取值
【发布时间】:2020-11-05 03:39:58
【问题描述】:

我的架构看起来像这样。

{
  _id: '1',
  items: {
    'id1': 'item1',
    'id2': 'item2',
    'id3': 'item3'
  }
}

下面是查询

ItemModel.find({}, {
  items: 1,
  _id: 0
});

而查找查询的结果是:

{ "items" : { "21" : "item21", "22" : "item22", "23" : "item23" } }
{ "items" : { "31" : "item31", "32" : "item32", "33" : "item33" } }
{ "items" : { "11" : "item11", "12" : "item32", "13" : "item13" } }

我想要的是:

["item21", "item22", "item23",
 "item31", "item32", "item33",
 "item11", "item12", "item13"]

目前,我正在 node.js 端进行处理以获取上述内容。我想减少来自 MongoDB 的输出有效负载大小。 “items”键是多余的,当我获取它时,提到的 ID 也不是必需的。在这里,ID 非常小,例如 21、22、13 等,但它们的长度实际上是 50 个字符。

如果不是上述情况,也欢迎任何其他有效的替代方案。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    如何实现的一个示例是以下聚合:

    [
      {
        $project: {
          items: {
            $objectToArray: '$items',
          },
        },
      },
      { $unwind: '$items' },
      {
        $project: {
          items: '$items.v',
        },
      },
      {
        $group: {
          _id: null,
          items: {
            $push: '$items',
          },
        },
      }
    ];
    

    首先我们将$project & $objectToArray 字段转换为数组,以便我们可以使用$unwind。这样,我们将拥有具有不同 items 的文档。现在我们与另一个 $project 进行转换,使其成为字符串而不是对象(这将是 { v: <value>, k: <value> }。最后,我们将 $group 放在一起。

    最终结果:

    要准确获取该列表,您需要在代码中访问items 字段,例如result[0].items[0],因为聚合将返回一个数组)。

    【讨论】:

    • 这是完美的。我通过文档能够将其实现为 id: item... 但是现在您通过将 id 作为 null 并将其余项目发送到数组中来更进一步。太感谢了!这使它成为一个文档。
    • 这应该适用于较小的数据集。如果文档大小大于 16 MB,这将失败。 (就像它对我所做的那样)。
    • 在这种情况下未考虑文档大小。但是如果您的文档很大,您也可以使用$project 阶段作为第一个阶段来投影仅需要的字段(可能items 是您唯一需要的)。没有看到你有什么样的文件(由于大小限制),很难确定哪里可以改进:)
    • 没有@Gytis TG。最终输出文档,即 {_id: null, items: []} 超过了 16MB 的限制,因为它在数组中有 30 万个项目。输出的总大小对我来说是 52MB。这就是为什么,我将其获取为 [{_id: 'item11'},{_id: 'item21'},{...}, ...]。因此,每个文档只有几个字节。但 Output 的最终大小仍然是 ~52MB。非常感谢您的回答。这是非常有见地的。其他时候可能会派上用场。
    猜你喜欢
    • 2017-01-15
    • 2021-05-17
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多