Like Count Query Mongoose



我有两个猫鼬集合A和集合B

Collection A(User):

{
id : 1,
Name : User1,
},
{
id: 2,
Name :  User2
},
{
id: 3,
Name: User3
}
collection B(Item) :
{
id :1,
name : Item1
},
{
id: 2,
name: Item2
}

Collection C(ItemLikes)
{
id : 11,
isLike : true,
userId : 1,
itemId : 1,
}
{
id:12,
isLike : true,
userId : 2,
ItemId : 1
},
{
id:13,
isLike : false,
userId : 3,
ItemId : 1
},
{
id:14,
isLike : false,
userId : 3,
ItemId : 2
}

现在我需要以下输出

{
ItemId : 1,
totalLikes(true) :  2,
isYourLike : true,
userId: 1
}

如果您只想调查项目1,请使用$group

  • $matchfind itemId is 1
  • $group组按项目1和其中使用条件和
  • $project改变isYourLike为布尔值
db.itemLikes.aggregate([
{
"$match": {
"itemId": 1
},

},
{
$group: {
"_id": "$itemId",
"isYourLike": {
$sum: {
$cond: [
{
$and: [
{
$eq: [
"$isLike",
true
]
},
{
$eq: [
"$userId",
1
]
}
]
},
1,
0
]
}
},
"totalLikes(true)": {
$sum: {
$cond: [
{
$eq: [
"$isLike",
true
]
},
1,
0
]
}
}
}
},
{
"$project": {
"itemId": "$_id",
"isYourLike": {
$cond: {
if: {
$gte: [
"$isYourLike",
1
]
},
then: true,
else: false
}
},
"totalLikes(true)": 1
}
}
])

例子:mongoplayground


如果你想计数每一项,使用$lookup

  • $lookup加入不同的集合
  • $project条件总和
  • $project更改isYourLike为布尔值
db.item.aggregate([
{
"$lookup": {
"from": "itemLikes",
"localField": "id",
"foreignField": "itemId",
"as": "likes"
}
},
{
"$project": {
"itemId": "$id",
"totalLikes(true)": {
"$size": {
"$filter": {
"input": "$likes",
"cond": {
"$eq": [
"$$this.isLike",
true
]
}
}
}
},
"isYourLike": {
"$size": {
"$filter": {
"input": "$likes",
"cond": {
$and: [
{
$eq: [
"$$this.isLike",
true
]
},
{
$eq: [
"$$this.userId",
1
]
}
]
}
}
}
},

}
},
{
"$project": {
"itemId": "$itemId",
"isYourLike": {
$cond: {
if: {
$gte: [
"$isYourLike",
1
]
},
then: true,
else: false
}
},
"totalLikes(true)": 1
}
}
])

例子:mongoplayground

最新更新