Mongodb - 针对键值等于 true 的对象数组进行聚合查询

Mongodb - aggregate query against array of objects where key value equals true

我有一个名为 items 的文档集合,每个文档中都有一个 field:value 这样:

{
  likes: [
    0: {
      like: false
      actor: { Object }
    },
    1: {
      like: true
      actor: { Object }
    },
    ...
  ]
}

我需要 return 文档基于文档是否有任何喜欢。

likes 数组开始时为空。如果一个人喜欢某个项目,likes 数组将添加一个包含 like:true 和相关演员详细信息的新对象。如果同一个人删除了那个特定对象将被更新为 like:false.

在查看结果时,一个人可以选择只查询喜欢或不喜欢的文档。

预期结果
With likes - 查询应该 return 仅具有 1 个或多个 likes 的文档。这被定义为:likes 数组必须至少有 1 个对象,其中 like:true 存在。
没有点赞 - 查询应该 return 只有 0 个点赞的文档。这被定义为:likes 数组必须为空或必须有 0 个对象 like:true 存在。

{ item: A, likes: [] }
{ item: B, likes: [{ like: false, actor: Beth }, { like: false: actor: John }] }
{ item: C, likes: [{ like: true, actor: Jeff }, { like: true: actor: Jess }] }
{ item: D, likes: [{ like: false, actor: Bob }] }
{ item: E, likes: [{ like: false, actor: AJ }, { like: true: actor: Raluca }] }
{ item: F, likes: [{ like: true, actor: Craig }] }

喜欢 - 查询应该 return 项目 C + E + F
没有喜欢 - 查询应该 return items A + B + D

我怎样才能做到这一点?

上次尝试

当前尝试的逻辑失败,因为它只检查数组的长度。如果用户立即删除了一个赞,returns 错误的结果。

matchQueryConditions.$and.push({
  $expr: { [searchOptions.withLikes === true ? '$gt' : '$eq']: [{ $size: '$likes' }, 0] },
});

看了无数次 docs 终于点击了,答案相对简单。以下调整修复了它:

matchQueryConditions.$and.push({
    'likes.like' : {
      [searchOptions.withLikes === true ? '$eq' : '$ne']: true
    }
});