node.js - 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'} }],
解决方案
演示 - 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"
]
}
}
],
},
},
])
推荐阅读
- openedge - 动态功能正在进行中
- node.js - 如何解决require未定义?
- react-native - 如何使所有组件响应
- php - 如何在多对多关系中获取枢轴数据
- apache-kafka - 我们如何连接 AMPS[CRANK UP THE AMPS] 服务器和 Apache Flink 以实现实时流?
- google-chrome - 如何在 chrome v71.0.3578.80 中禁用 #top-chrome-md
- java - 在 Mockito 中使用 doNothing() 的非 void 方法?
- python - 使用简单路径找不到 Django 页面
- webrtc - 离开房间后,在 RTCMultiConnection 的 safari 浏览器中显示黑屏
- jboss - JBoss EAP:域模式下的保险库