计数并应用条件对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它起作用了。