node.js - MongoDB 聚合:检查用户是否已经评价过产品

通过直接使用 mongo 而不是 node 来解决这个问题时,我遇到了一些麻烦。

我有一个包含多个字段的产品集合,包括一系列评级。评分由评分用户的 id 和分数组成。它们看起来像这样:

{
  "_id": {
    "$oid": "62812fac06f29f5fe874c0db"
  },
  "model": "fire",
  "allRatings": [
    {
      "user_id": "6282962e3aa8163084776092",
      "rating": 9
    },
    {
      "user_id": "62811d520f52b64990a94e99",
      "rating": 6
    }
  ],
}

我想返回所有字段,但不是所有评级,我只想返回一个布尔值,显示当前用户(我在代码中拥有其 ID)是否已经对产品进行了评级。我尝试过聚合,但没有找到任何可行的解决方案。

像这样的东西:

{
  "_id": {
    "$oid": "62812fac06f29f5fe874c0db"
  },
  "model": "fire",
  "hasRated": true,
}

回答1

如果我理解正确,您可以使用此聚合查询:

此查询查找您想要的对象(通过 _id 匹配),然后进入 $project 阶段,如果所需的 id 存在于数组中,它会设置 value hasRated

db.collection.aggregate([
  {
    $match: {
      _id: ObjectId("62812fac06f29f5fe874c0db")
    }
  },
  {
    $project: {
      model: 1,
      hasRated: {
        "$in": [
          "6282962e3aa8163084776092",
          "$allRatings.user_id"
        ]
      }
    }
  }
])

示例https://mongoplayground.net/p/96nhfR31xZm

要在 JS 中做,您可以简单地创建添加 id 作为变量的对象(类似这样,是伪代码,未经测试):

const id = 'your_id_here'
const agg = [{
    $match: {
      _id: new ObjectId("62812fac06f29f5fe874c0db")
    }
  },
  {
    $project: {
      model: 1,
      hasRated: {
        "$in": [
          id,
          "$allRatings.user_id"
        ]
      }
    }
  }]

db.aggregate(agg)

相似文章

java - 连接MongoDB

早上好。我在连接到MongoDB数据库时遇到问题。我在docker-compose.yml文件中为自己配置了一个数据库和mongoexpress。使用CommandLineRunner,我想将示例数据...