MongoDB 布尔查询
MongoDB Boolean Query
我有如下文档故事集
[
{
createdBy:'user1',
storyId:1,
viewers:['user3'],
},
{
createdBy:'user2',
storyId:2,
viewers:['user3'],
},
{
createdBy:'user2',
storyId:3,
viewers:['user4'],
},
{
createdBy:'user5',
storyId:4,
viewers:['user3'],
},
{
createdBy:'user5',
storyId:5,
viewers:['user3'],
}
]
假设user3请求获取他是否查看过特定用户的每个故事的状态。如果 viewers 数组在所有文档中包含他的用户 ID('user3'),我想 return TRUE 如果任何文档不包含他的用户 ID 在数组中,我想为 FALSE。希望你能理解我的问题。
预期输出
[
{
createdBy:'user1',
isAllViewed: true
},
{
createdBy:'user2',
isAllViewed: false
},
{
createdBy:'user5',
isAllViewed: true
},
]
您可以试试这个聚合查询:
用和之前一样的思路,用$setInteresection
知道数组中是否有user3
。如果存在或不存在,它会生成一个值为 true
或 false
的数组。
所以下一阶段是检查 $allElementsTrue
。
db.collection.aggregate([
{
"$group": {
"_id": "$createdBy",
"isAllViewed": {
"$push": {
"$ne": [
{
"$setIntersection": [
"$viewers",
[
"user3"
]
]
},
[]
]
}
}
}
},
{
"$project": {
"_id": 0,
"createdBy": "$_id",
"isAllViewed": {
"$allElementsTrue": "$isAllViewed"
}
}
}
])
示例here
查询
- 按创建者分组
- 如果
user3
包含在“查看器”中,则创建一个 [true false ...] 数组
- 然后检查该数组中的所有内容是否都为真
db.collection.aggregate([
{
"$group": {
"_id": "$createdBy",
"isAllViewed": {
"$push": {
"$in": [
"user3",
"$viewers"
]
}
}
}
},
{
"$project": {
"_id": 0,
"createdBy": "$_id",
"isAllViewed": {
"$allElementsTrue": "$isAllViewed"
}
}
}
])
我有如下文档故事集
[
{
createdBy:'user1',
storyId:1,
viewers:['user3'],
},
{
createdBy:'user2',
storyId:2,
viewers:['user3'],
},
{
createdBy:'user2',
storyId:3,
viewers:['user4'],
},
{
createdBy:'user5',
storyId:4,
viewers:['user3'],
},
{
createdBy:'user5',
storyId:5,
viewers:['user3'],
}
]
假设user3请求获取他是否查看过特定用户的每个故事的状态。如果 viewers 数组在所有文档中包含他的用户 ID('user3'),我想 return TRUE 如果任何文档不包含他的用户 ID 在数组中,我想为 FALSE。希望你能理解我的问题。
预期输出
[
{
createdBy:'user1',
isAllViewed: true
},
{
createdBy:'user2',
isAllViewed: false
},
{
createdBy:'user5',
isAllViewed: true
},
]
您可以试试这个聚合查询:
用和之前一样的思路,用$setInteresection
知道数组中是否有user3
。如果存在或不存在,它会生成一个值为 true
或 false
的数组。
所以下一阶段是检查 $allElementsTrue
。
db.collection.aggregate([
{
"$group": {
"_id": "$createdBy",
"isAllViewed": {
"$push": {
"$ne": [
{
"$setIntersection": [
"$viewers",
[
"user3"
]
]
},
[]
]
}
}
}
},
{
"$project": {
"_id": 0,
"createdBy": "$_id",
"isAllViewed": {
"$allElementsTrue": "$isAllViewed"
}
}
}
])
示例here
查询
- 按创建者分组
- 如果
user3
包含在“查看器”中,则创建一个 [true false ...] 数组 - 然后检查该数组中的所有内容是否都为真
db.collection.aggregate([
{
"$group": {
"_id": "$createdBy",
"isAllViewed": {
"$push": {
"$in": [
"user3",
"$viewers"
]
}
}
}
},
{
"$project": {
"_id": 0,
"createdBy": "$_id",
"isAllViewed": {
"$allElementsTrue": "$isAllViewed"
}
}
}
])