MongoDB:查询以匹配数组中的每个元素与条件
Posted
技术标签:
【中文标题】MongoDB:查询以匹配数组中的每个元素与条件【英文标题】:MongoDB: query to match each element in array with condition 【发布时间】:2021-05-06 11:57:45 【问题描述】:我有一个类似的文档集合(事件),
[
_id: 1,
followerRange: [
min: 5000, max: 50000, type: 'instagram',
min: 1000, max: 5000, type: 'facebook',
min: 1000, max: 25000, type: 'youtube',
]
,
_id: 2,
followerRange: [
min: 10000, max: 50000, type: 'instagram',
min: 5000, max: 10000, type: 'facebook',
min: 10000, max: 100000, type: 'youtube',
]
,
_id: 3,
followerRange: [
min: 10000, max: 500000, type: 'instagram',
min: 10000, max: 100000, type: 'facebook',
min: 50000, max: 100000, type: 'youtube',
min: 50000, max: 100000, type: 'twitter',
]
]
这说明了在特定社交渠道上加入活动所需的最低关注者/订阅者是多少。
现在,一个用户有三个频道,比如,
[
type: 'instagram',
followers: 7000
,
type: 'facebook',
followers: 3000
,
type: 'youtube',
followers: 12000
]
现在,要显示给该用户的事件集合的所需输出将是 -
[
_id: 1,
followerRange: [
min: 5000, max: 50000, type: 'instagram',
min: 1000, max: 5000, type: 'facebook',
min: 1000, max: 25000, type: 'youtube',
]
]
解释:
-
因为用户拥有事件 1 所需的所有频道。
此外,各个频道的用户关注者数量也满足最小、最大范围的标准。
基本上,事件集合的输出将基于不同的用户及其频道(和关注者)。
请帮助我弄清楚如何根据活跃用户(频道)过滤事件。谢谢:)
【问题讨论】:
【参考方案1】:我建议你像这样改变事件集合的结构:
_id: 1,
followerRange:
instagram: min: 5000, max: 50000,
facebook: min: 1000, max: 5000,
youtube: min: 1000, max: 25000
那么就很简单了:
var instagramFollowers = 100;
db.events.find("followerRange.instagram.min":$lt: instagramFollowers, "followerRange.instagram.max":$gt: instagramFollowers, ... etc.)
【讨论】:
感谢您的回答,但在这种情况下,键将变为静态,查询也将变为硬编码,我不想依赖硬编码查询,即 followerRange.instagram.max:followerRange.instagram.min :followerRange.facebook.max ...等等。 :-( @ShivamVerma 关于静态:这取决于如何“烹饪”它。您可以使用followerRange
,例如使用哈希:event.followerRange["instagram"]
。您还可以动态构建查询。所以根本没有静电。【参考方案2】:
现在,你可以试试这个查询,我稍后会发布更高效的:
db.test.aggregate
([$unwind:"$followerRange",
$match:"$or":
["followerRange.min":$lte:5001,"followerRange.max":$gte:50000,"followerRange.type":"instagram",
"followerRange.min":$lte:1000,"followerRange.max":$gte:10000,"followerRange.type":"youtube",
"followerRange.min":$lte:1000,"followerRange.max":$gte:5000,"followerRange.type":"facebook"]$gte:40000,"followerRange.type":"instagram",
$group:_id:"$_id",ids:$push:"$followerRange",size:$sum:1,
$match:size:3
])
请忽略格式部分。
【讨论】:
以上是关于MongoDB:查询以匹配数组中的每个元素与条件的主要内容,如果未能解决你的问题,请参考以下文章