【问题标题】:MongoDB: query to match each element in array with conditionMongoDB:查询以匹配数组中的每个元素与条件
【发布时间】: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 所需的所有频道。
  2. 此外,各个频道的用户关注者数量也满足最小、最大范围的标准。
  3. 基本上,事件集合的输出将基于不同的用户及其频道(和关注者)。

请帮助我弄清楚如何根据活跃用户(频道)过滤事件。谢谢:)

【问题讨论】:

    标签: node.js arrays mongodb mongoose mongodb-query


    【解决方案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}}
    ])
    

    请忽略格式部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 2018-04-04
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多