如何在 find() 中获取数组长度而不是完整数组?

问题描述 投票:0回答:3

我有一个 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
值以及查找返回的文档:

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

问题是:如何获得数组长度以及

find
结果?

javascript node.js arrays mongodb mongoose
3个回答
5
投票

您可以在 find 的第二个参数中执行与聚合投影相同的操作, 从 MongoDB 4.4 开始,作为使查找投影与聚合的

$project
阶段保持一致的一部分,

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

游乐场


1
投票

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

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

0
投票

turivishal 的答案很好,但对我来说它不起作用,直到我确定而不是:

images: { $size: "$images" }

我还起了其他名字,比如:

imagesSize: { $size: "$images" }
© www.soinside.com 2019 - 2024. All rights reserved.