为了账号安全,请及时绑定邮箱和手机立即绑定

查找按最佳匹配排序的所有元素

查找按最佳匹配排序的所有元素

Go
阿波罗的战车 2023-08-14 17:02:04
我的数据库中有一些名为“事件”的实体。每个事件都包含一个字符串数组,称为“tags”。我想进行查询以获取与我将在参数中给出的标签数组匹配的所有事件。但是,我希望这些事件的排序如下:第一个是包含我在参数中给出的大部分标签的。第二个是包含我在参数中给出的大部分标签的第二个。等等。如果有多个事件包含相同数量的标签,我希望它们按“名称”属性按字母顺序排序。例子:"name" = "event1", "tags" = ["食物", "音乐", "游戏", "运动"]“名称”=“事件2”,“标签”=[“游戏”]“名称”=“事件3”,“标签”=[“音乐”,“运动”]"name" = "event4", "tags" = ["食物", "音乐", "游戏", "运动"]"name" = "event5", "tags" = ["music", "sport", "coding"]“名称”=“事件6”,“标签”=[“编码”]"name" = "event7", "tags" = ["食物", "游戏", "运动"]我在本示例的参数中给出的标签数组是:[“food”、“music”、“gaming”、“sport”]此示例的结果将是一个事件数组,按以下顺序包含: event1、event4、event7、event3、event5、event2为了获取包含标签的所有事件,我只需使用“$or”运算符进行查询。这使我能够获取所有事件(如果它们至少包含参数中给定的标签之一)。代码:    var events []model.Event    var MyQuery []map[string]interface{}    for i := 0; i < len(tags); i++ {        currentCondition := bson.M{"tags": tags[i]}        MyQuery = append(MyQuery, currentCondition)    }    err := dbEvents.C(collectionEvents).Find(bson.M{"$or": OrQuery}).All(&events)但我真的不知道如何像我向你展示的那样对它们进行排序。
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

package main


import (

    "fmt"


    "github.com/ahmetb/go-linq"

)


type T struct {

    Name string

    Tags []string

}


func main() {

    params := []string{"food", "music", "gaming", "sport"}

    t := []T{

        T{Name: "event1", Tags: []string{"food", "music", "gaming", "sport"}},

        T{Name: "event2", Tags: []string{"gaming"}},

        T{Name: "event3", Tags: []string{"music", "sport"}},

        T{Name: "event4", Tags: []string{"food", "music", "gaming", "sport"}},

        T{Name: "event5", Tags: []string{"music", "coding", "sport"}},

        T{Name: "event6", Tags: []string{"coding"}},

        T{Name: "event7", Tags: []string{"food", "gaming", "sport"}},

    }

    var result []T

    linq.From(t).SortT(func(t1 T, t2 T) bool {

        var rs1 []string

        linq.From(t1.Tags).IntersectByT(linq.From(params), func(str string) string {

            return str

        }).ToSlice(&rs1)

        var rs2 []string

        linq.From(t2.Tags).IntersectByT(linq.From(params), func(str string) string {

            return str

        }).ToSlice(&rs2)

        return len(rs1) > len(rs2)

    }).ToSlice(&result)


    fmt.Printf("%+v", result)

}

[{名称:event1 标签:[美食音乐游戏运动]} {名称:event4 标签:[美食音乐游戏运动]} {名称:event7 标签:[美食音乐游戏运动]} {名称:event3 标签:[音乐运动]} {名称:event5 标签:[音乐编码运动]} {名称:event2 标签:[游戏]} {名称:event6 标签:[编码]}]


上面的程序根据您的要求对数组进行排序,希望这会对您有所帮助。


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信