计数并应用条件对mongodb数组文档进行切片
我的文档结构如下所示:计数并应用条件对mongodb数组文档进行切片,mongodb,Mongodb,我的文档结构如下所示: { "_id" : ObjectId("5aeeda07f3a664c55e830a08"), "profileId" : ObjectId("5ad84c8c0e71892058b6a543"), "list" : [ { "content" : "answered your post", "createdBy" : ObjectId("5ad84c8c0e71892058b6a540
{
"_id" : ObjectId("5aeeda07f3a664c55e830a08"),
"profileId" : ObjectId("5ad84c8c0e71892058b6a543"),
"list" : [
{
"content" : "answered your post",
"createdBy" : ObjectId("5ad84c8c0e71892058b6a540")
},
{
"content" : "answered your post",
"createdBy" : ObjectId("5ad84c8c0e71892058b6a540")
},
{
"content" : "answered your post",
"createdBy" : ObjectId("5ad84c8c0e71892058b6a540")
},
],
}
我想数一数
列表字段。并在切片之前应用条件
如果
列表您的第一个$project
阶段有效地清除了所有结果字段,但它显式投影的字段除外(在您的情况下仅notifs
)。这就是为什么第二个$project
阶段不能再$slice
列表
字段(它已被第一个$project
阶段删除)
另外,我认为您的$cond
/$slice
组合可以使用$min
操作符更优雅地表达。因此,对于您的问题,至少有以下两种修复方法:
使用$addFields
:
db.getCollection('post').aggregate([
{ $match: { profileId: ObjectId("5ad84c8c0e71892058b6a543") } },
{ $addFields: { notifs: { $size: "$list" } } },
{ $project: {
notifications: {
$slice: [ "$list", { $min: [ "$notifs", 10 ] } ]
}
}}
])
在$project中使用计算-这避免了一个阶段,因此应该更可取
db.getCollection('post').aggregate([
{ $match: { profileId: ObjectId("5ad84c8c0e71892058b6a543") } },
{ $project: {
notifications: {
$slice: [ "$list", { $min: [ { $size: "$list" }, 10 ] } ]
}
}}
])
您的第一个
$project
阶段有效地清除了所有结果字段,但它显式投影的字段除外(在您的情况下,只有notifs
)。这就是为什么第二个$project
阶段不能再$slice
列表字段(它已被第一个$project
阶段删除)
另外,我认为您的$cond
/$slice
组合可以使用$min
操作符更优雅地表达。因此,对于您的问题,至少有以下两种修复方法:
使用$addFields
:
db.getCollection('post').aggregate([
{ $match: { profileId: ObjectId("5ad84c8c0e71892058b6a543") } },
{ $addFields: { notifs: { $size: "$list" } } },
{ $project: {
notifications: {
$slice: [ "$list", { $min: [ "$notifs", 10 ] } ]
}
}}
])
在$project中使用计算-这避免了一个阶段,因此应该更可取
db.getCollection('post').aggregate([
{ $match: { profileId: ObjectId("5ad84c8c0e71892058b6a543") } },
{ $project: {
notifications: {
$slice: [ "$list", { $min: [ { $size: "$list" }, 10 ] } ]
}
}}
])
尝试使用
$addFields
而不是第一个$project
。谢谢@dnickless它起作用了。尝试使用$addFields
而不是第一个$project
。谢谢@dnickless它起作用了。