【问题标题】:mongo sort by group criteriamongo 按组标准排序
【发布时间】:2018-08-06 18:33:06
【问题描述】:

我有这样的数据结构(mongo 2.6):

{"player":"John Doe","active":true}

假设我在执行搜索时使用术语“ohn”,我需要根据某些条件进行排序:

  1. 名字为“ohn”且活跃的玩家
  2. 名字包含“ohn”且活跃的玩家
  3. 名称为“ohn”但未激活的玩家
  4. 名称包含“ohn”但未激活的玩家

如何在 mongo 2.6 中实现这一点? 预期的输出是满足这 4 个条件中的任何一个的所有玩家,但按该顺序排序(满足暴击 1 的玩家,然后满足暴击 2 的玩家,依此类推)。我还想添加分页(跳过和限制) 谢谢

【问题讨论】:

  • 你能添加预期的输出吗?
  • @RahulSharma 我希望有一份符合这 4 个标准中任何一个的球员名单,但按 1 到 4 的顺序排序

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

在这里我创建了用于排序的附加列调用点

  1. active = true 给 2 分
  2. 整个播放器包含单词给1分

并按点降序对结果进行排序。这是查询

    db.yourtable.aggregate(
        [ 
             { $match : { "player": /ohn/i } } /* select all contain ohn ignore case */
            ,{ $project:{
                player: 1,
                active: 1,
                point: { $add: [ 
                                {$cond: { if: { $eq: [ "$active", true ] }, then: 2, else: 0 }}                      /* active = true give 2 point */
                                , {$cond: { if: { $eq: [ { $toLower: "$player" }, 'ohn' ] }, then: 1, else: 0 }}     /* player contain whole word give 1 point */
                        ]}

                }
            }
            ,{ $sort : { point : -1 } }  /* sort by point */
        ]
    );

我忽略大小写,希望对您有所帮助

【讨论】:

    【解决方案2】:

    试试这个,希望这会有所帮助。

    db.getCollection('TEST').find({}).sort({"active":-1}).toArray().reduce(function(doc1, doc2) {
        if(doc2.player == "ohn" && doc2.active)
            doc1.unshift(doc2)
        else
            doc1.push(doc2)
      return doc1; 
    },[]);
    

    【讨论】:

    • 是否可以使用聚合而不是 map reduce?谢谢
    • 这只是为了精确匹配?不是部分匹配?
    • 我不确定,聚合是否适用于自定义订单和条件。
    【解决方案3】:
    db.collection.aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $match: {
                    $or: [{
                        $text: {
                            $search: "ohn"
                        }
                    }, {
                        player: /ohn/i
                    }],
                    active: {
                        $in: [true, false]
                    }
                }
            },
    
            // Stage 2
            {
                $sort: {
                    active: -1
                }
            },
    
        ]
    
    
    
    ); 
    

    在上述聚合查询中,执行文本搜索以根据问题描述中提到的标准从 MongoDB 集合中过滤和排序文档。

    文本索引需要应用于需要过滤的字段,以便在 MongoDB 集合中执行基于文本的搜索。

    【讨论】:

    • 结果的排序呢?这似乎只按活动排序,没有基于完全匹​​配或部分匹配的排序。排序必须首先按活动进行,然后按完全匹配或部分匹配,因此,2 个字段
    • 以上查询将结果按活动字段的降序排序,并在应用文本搜索时将结果按最接近匹配值的顺序返回
    猜你喜欢
    • 2012-02-20
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多