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:查询以匹配数组中的每个元素与条件的主要内容,如果未能解决你的问题,请参考以下文章

检查数组中的每个元素是不是匹配条件

mongodb - 如果数组中的某个元素与查询匹配,则忽略文档

MongoDB计数按数组元素分组的数组中的匹配字符串

如何将每个数组字段与MongoDB中的其他字段匹配

mongodb 查询求助,嵌套数组里面查东西

在Java中查询具有完全匹配字段MongoDB的数组元素