【问题标题】:How to get array length instead of full array in find()?如何在 find() 中获取数组长度而不是完整数组?
【发布时间】:2021-04-16 07:50:47
【问题描述】:

我有一个 mongodb(使用 mongoose)集合(“items”),它的属性中包含一个数组(“images”)。一些示例文档:

[
  {
    "_id" : ObjectId("543fa67e9672ec37ebe3d026"),
    "name" : "Alice",
    "images" : [
      { url: "http://images.com/1.jpg" },
      { url: "http://images.com/2.jpg" },
      { url: "http://images.com/3.jpg" },
    ]
  },
  {
    "_id" : ObjectId("543fa67e9672ec37ebe3d027"),
    "name" : "Bob",
    "images" : [
      { url: "http://images.com/4.jpg" },
      { url: "http://images.com/5.jpg" },
    ]
  },
]

我想实现一个查询,它与其他文档属性一起返回数组长度(而不是数组内容)。我知道我可以得到数组长度

db.items.aggregate([
  { "$project" : { "_id" : 0, "imagesLength" : { "$size" : "$images" } } }
])

但我需要 imagesLength 值以及 find 返回的文档:

db.items.findMany(
  { ...filter },
  { name: 1, imagesCount: 1 }
);

问题是:我怎样才能得到数组长度以及find 结果?

【问题讨论】:

    标签: javascript node.js arrays mongodb mongoose


    【解决方案1】:

    您可以首先在聚合中添加匹配阶段以过滤结果。然后您可以投影所有需要的字段并生成新字段。

    db.items.aggregate([
      { "$match" : { ...filter },
      { "$project" : { "imagesLength" : { "$size" : "$images" }, "name": 1 } }
    ])
    

    【讨论】:

      【解决方案2】:

      您可以在 find 的第二个参数中执行与聚合投影相同的操作, Starting in MongoDB 4.4,作为使 find 投影与聚合的 $project 阶段一致的一部分,

      db.items.find(
      { ...filter },
      {
        _id: 0,
        name: 1,
        images: { $size: "$images" }
      })
      

      Playground

      【讨论】:

        猜你喜欢
        • 2017-06-19
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        相关资源
        最近更新 更多