在聚合器中使用基于子文档值的条件的过滤器

用户名

我想根据用户ID检索子文档中的日期字段messages,从文档中过滤出子文档discussiondeletion

在JavaScript中,它将给出以下内容(仅作说明)

discussion.messages.filter(message => message.createdAt < discussion.deletions[userID].updatedAt)

这是我现在拥有的:

Discussion.aggregate([
  {
    $match: {
      _id: mongoose.Types.ObjectId(discussionID),
      participants: userID
    }
  },
  {
    $project: {
      messages: {
        $slice: [{
          $filter: {
            input: '$messages',
            as: 'message',
            cond: {
              $and: // the filtering condition should be there
            }
          }
        }, limit]
      }
    }
  }
])

任何想法 ?

详细信息如下:

const DeletionSchema = Schema({
  userID: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  }
},{
  timestamps: {
    createdAt: true
})

const DiscussionSchema = Schema({
  participants: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }],
  messages: [MessageSchema],
  deletions: [DeletionSchema]
}, {
  timestamps: true
})

const MessageSchema = Schema({
  author: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  text: String
}, {
  timestamps: true
})
{
    "_id" : ObjectId("5fc09358355f682571644db5"),
    "participants" : [ 
        ObjectId("5fbdb3c0d1daa832cce7435f"), 
        ObjectId("5fbe92f63bcc731d3d677a26")
    ],
    "__v" : 0,
    "createdAt" : ISODate("2020-11-27T05:49:12.784Z"),
    "messages" : [ 
        {
            "deletedAt" : null,
            "_id" : ObjectId("5fc09ab7ad6276548b328a43"),
            "author" : ObjectId("5fbe92f63bcc731d3d677a26"),
            "text" : "This one must stay !",
            "updatedAt" : ISODate("2020-11-27T06:20:39.803Z"),
            "createdAt" : ISODate("2020-11-27T06:20:39.803Z")
        }, 
        {
            "deletedAt" : null,
            "_id" : ObjectId("5fc099a8b4415f528ceabc43"),
            "author" : ObjectId("5fbe92f63bcc731d3d677a26"),
            "text" : "This one must stay !",
            "updatedAt" : ISODate("2020-11-27T06:16:08.173Z"),
            "createdAt" : ISODate("2020-11-27T06:16:08.173Z")
        }, 
        {
            "deletedAt" : null,
            "_id" : ObjectId("5fc09358efb3374d4e2264be"),
            "author" : ObjectId("5fbe92f63bcc731d3d677a26"),
            "text" : "Hello world",
            "updatedAt" : ISODate("2020-11-27T05:49:12.784Z"),
            "createdAt" : ISODate("2020-11-27T05:49:12.784Z")
        }
    ],
    "updatedAt" : ISODate("2020-11-27T06:20:39.803Z"),
    "deletions" : [ 
        {
            "_id" : ObjectId("5fc095d220928a4eff942652"),
            "userID" : ObjectId("5fbe92f63bcc731d3d677a26"),
            "updatedAt" : ISODate("2020-11-27T05:59:46.731Z"),
            "createdAt" : ISODate("2020-11-27T05:59:46.731Z")
        }
    ]
}

因此,如果给定userIDdeletions子文档匹配,我想过滤掉message删除后创建的对象createdAt

土生的
  • $match 过滤条件
  • $addFields添加新字段deletion$filter使用该结果获取userID对象deletions并从该结果获取第一个对象$first
  • $project显示必填字段,按日期过滤messages使用$filter和条件,以及$slice获取有限的消息
Discussion.aggregate([
  {
    $match: {
      _id: mongoose.Types.ObjectId(discussionID),
      participants: mongoose.Types.ObjectId(userID)
    }
  },
  {
    $addFields: {
      deletion: {
        $first: {
          $filter: {
            input: "$deletions",
            cond: { $eq: ["$$this.userID", mongoose.Types.ObjectId(userID)] }
          }
        }
      }
    }
  },
  {
    $project: {
      messages: {
        $slice: [
          {
            $filter: {
              input: "$messages",
              cond: { $lt: ["$$this.createdAt", "$deletion.updatedAt"] }
            }
          },
          limit
        ]
      }
    }
  }
])

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于最大值的MongoDB聚合过滤器

来自分类Dev

猫鼬:使用子文档过滤器查找文档

来自分类Dev

防止在条件语句中使用条件过滤器

来自分类Dev

在Vue2中使用过滤器时如何重置子组件的值

来自分类Dev

熊猫使用groupby和基于值的过滤器

来自分类Dev

如何在子选择中使用过滤器

来自分类Dev

如何在LinkEntity中使用条件和过滤器?

来自分类Dev

如何在LinkEntity中使用条件和过滤器?

来自分类Dev

基于不同列的多个过滤器的pandas df中的列的聚合值-python2.7

来自分类Dev

Mongodb使用多个过滤器聚合

来自分类Dev

基于检索值的Django过滤器

来自分类Dev

基于过滤器数组的属性值

来自分类Dev

如何使用基于 id 相关名称的过滤器在 angularjs 中使用过滤器

来自分类Dev

最少文档数的Elasticsearch过滤器聚合

来自分类Dev

如何基于过滤器参数定义文档排序

来自分类Dev

在弹性搜索中使用带有过滤器的聚合

来自分类Dev

核心数据在过滤器中使用聚合函数

来自分类Dev

在弹性搜索中使用过滤器查询嵌套字段上的聚合

来自分类Dev

如何使用带有ng-repeat的过滤器基于字段值过滤和对象

来自分类Dev

MongoDB 聚合过滤器

来自分类Dev

从多个数组返回特定值的聚合过滤器

来自分类Dev

在Django过滤器中使用dateadd

来自分类Dev

在Laravel中使用多个过滤器

来自分类Dev

在高级过滤器中使用间接

来自分类Dev

在Django过滤器中使用dateadd

来自分类Dev

我如何在带有.NET文档的Zealdocs中使用搜索过滤器?

来自分类Dev

子文档中的猫鼬过滤器

来自分类Dev

如何将withcolumn方法与基于多个条件的过滤器一起使用?

来自分类Dev

如何在Google表格中的宏(Google表格,过滤器,如果是其他脚本)中使用特定条件的特定激活值空列过滤器的if条件?

Related 相关文章

  1. 1

    基于最大值的MongoDB聚合过滤器

  2. 2

    猫鼬:使用子文档过滤器查找文档

  3. 3

    防止在条件语句中使用条件过滤器

  4. 4

    在Vue2中使用过滤器时如何重置子组件的值

  5. 5

    熊猫使用groupby和基于值的过滤器

  6. 6

    如何在子选择中使用过滤器

  7. 7

    如何在LinkEntity中使用条件和过滤器?

  8. 8

    如何在LinkEntity中使用条件和过滤器?

  9. 9

    基于不同列的多个过滤器的pandas df中的列的聚合值-python2.7

  10. 10

    Mongodb使用多个过滤器聚合

  11. 11

    基于检索值的Django过滤器

  12. 12

    基于过滤器数组的属性值

  13. 13

    如何使用基于 id 相关名称的过滤器在 angularjs 中使用过滤器

  14. 14

    最少文档数的Elasticsearch过滤器聚合

  15. 15

    如何基于过滤器参数定义文档排序

  16. 16

    在弹性搜索中使用带有过滤器的聚合

  17. 17

    核心数据在过滤器中使用聚合函数

  18. 18

    在弹性搜索中使用过滤器查询嵌套字段上的聚合

  19. 19

    如何使用带有ng-repeat的过滤器基于字段值过滤和对象

  20. 20

    MongoDB 聚合过滤器

  21. 21

    从多个数组返回特定值的聚合过滤器

  22. 22

    在Django过滤器中使用dateadd

  23. 23

    在Laravel中使用多个过滤器

  24. 24

    在高级过滤器中使用间接

  25. 25

    在Django过滤器中使用dateadd

  26. 26

    我如何在带有.NET文档的Zealdocs中使用搜索过滤器?

  27. 27

    子文档中的猫鼬过滤器

  28. 28

    如何将withcolumn方法与基于多个条件的过滤器一起使用?

  29. 29

    如何在Google表格中的宏(Google表格,过滤器,如果是其他脚本)中使用特定条件的特定激活值空列过滤器的if条件?

热门标签

归档