首页 > 解决方案 > Mongoose 聚合管道:与自己的对象进行比较

问题描述

我有一个看起来像这样的示例猫鼬对象:

  {
    _id: 5fa849ad4f6be0382363809c,
    ratings: {
      ratedPersonId: 7,
      rating: 7,
      timeSpent: 30,
      timestamp: 78,
      userThreshold: 5
    }
  },

它包含一个_id和一个评级列表,这是一个具有以下功能的子文档。

我创建了一个这样的聚合管道:

    const ratedUser = await this.ratingModel
      .aggregate([
        { $project: { ratings: 1 } },
        { $unwind: '$ratings' },
        {
          $match: {
            $and: [{ 'ratings.ratedPersonId': userId }, { 'ratings.rating': { $gte: 5 } }],
          },
        },
      ])
      .exec()

这适用于第一个条件ratings.ratedPersonId: userId

我的问题是我的第二个条件是评级应该大于或等于userThreshold同一对象中的字段。

每当我在查询中输入它时,它什么都不返回

 $and: [{ 'ratings.ratedPersonId': userId }, { 'ratings.rating': { $gte: 'ratings.threshold'} }],

标签: node.jsmongodbtypescriptmongodb-queryaggregation-framework

解决方案


演示 - https://mongoplayground.net/p/AQMsJGkoFcu

使用$expr比较字段

读取聚合表达式

$expr 可以构建查询表达式,在 $match 阶段比较来自同一文档的字段。如果 $match 阶段是 $lookup 阶段的一部分,则 $expr 可以使用 let 变量比较字段。有关示例,请参阅使用 $lookup 指定多个连接条件。$expr 仅在 $match 阶段使用集合中的索引进行相等匹配。$expr 不支持多键索引。

db.collection.aggregate([
  {
    $project: {
      ratings: 1
    }
  },
  {
    $unwind: "$ratings"
  },
  {
    $match: {
      $and: [
        {
          "ratings.ratedPersonId": 7
        },
        {
          $expr: {
            $gte: [
              "$ratings.rating",
              "$ratings.userThreshold"
            ]
          }
        }
      ],
      
    },
  },
])

推荐阅读