我有两个猫鼬集合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
$match
find 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