我有一个 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
结果?
您可以在 find 的第二个参数中执行与聚合投影相同的操作, 从 MongoDB 4.4 开始,作为使查找投影与聚合的
$project
阶段保持一致的一部分,
db.items.find(
{ ...filter },
{
_id: 0,
name: 1,
images: { $size: "$images" }
})
您可以首先在聚合中添加匹配阶段来过滤结果。然后您可以投影所需的所有字段并生成新字段。
db.items.aggregate([
{ "$match" : { ...filter },
{ "$project" : { "imagesLength" : { "$size" : "$images" }, "name": 1 } }
])
turivishal 的答案很好,但对我来说它不起作用,直到我确定而不是:
images: { $size: "$images" }
我还起了其他名字,比如:
imagesSize: { $size: "$images" }