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

我的数据库中有一些名为"events"的实体。这些事件中的每一个都包含一个字符串数组,称为"tags"

我想进行查询以获取与我将在参数中给出的标签数组匹配的所有事件。

但是,我希望这些事件的排序如下:

  • 第一个是包含我在参数中给出的大部分标签的那个。

  • 第二个是包含我在参数中给出的大部分标签的第二个。

  • 等等。

如果有多个事件包含相同数量的标签,我希望它们按其“名称”属性按字母顺序排序

例子:

  • “名称” = “事件 1”、“标签” = [“食物”、“音乐”、“游戏”、“运动”]

  • “名称” = “事件 2”,“标签” = [“游戏”]

  • “名称” = “事件 3”、“标签” = [“音乐”、“运动”]

  • “名称” = “事件 4”、“标签” = [“食物”、“音乐”、“游戏”、“运动”]

  • “名称” = “事件 5”、“标签” = [“音乐”、“运动”、“编码”]

  • “名称” = “事件 6”,“标签” = [“编码”]

  • “名称” = “事件 7”、“标签” = [“食物”、“游戏”、“运动”]

我在这个例子的参数中给出的标签数组是:["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)

但我真的不知道如何像我向你展示的那样对它们进行排序。


潇湘沐
浏览 85回答 1
1回答

小唯快跑啊

package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "github.com/ahmetb/go-linq")type T struct {&nbsp; &nbsp; Name string&nbsp; &nbsp; Tags []string}func main() {&nbsp; &nbsp; params := []string{"food", "music", "gaming", "sport"}&nbsp; &nbsp; t := []T{&nbsp; &nbsp; &nbsp; &nbsp; T{Name: "event1", Tags: []string{"food", "music", "gaming", "sport"}},&nbsp; &nbsp; &nbsp; &nbsp; T{Name: "event2", Tags: []string{"gaming"}},&nbsp; &nbsp; &nbsp; &nbsp; T{Name: "event3", Tags: []string{"music", "sport"}},&nbsp; &nbsp; &nbsp; &nbsp; T{Name: "event4", Tags: []string{"food", "music", "gaming", "sport"}},&nbsp; &nbsp; &nbsp; &nbsp; T{Name: "event5", Tags: []string{"music", "coding", "sport"}},&nbsp; &nbsp; &nbsp; &nbsp; T{Name: "event6", Tags: []string{"coding"}},&nbsp; &nbsp; &nbsp; &nbsp; T{Name: "event7", Tags: []string{"food", "gaming", "sport"}},&nbsp; &nbsp; }&nbsp; &nbsp; var result []T&nbsp; &nbsp; linq.From(t).SortT(func(t1 T, t2 T) bool {&nbsp; &nbsp; &nbsp; &nbsp; var rs1 []string&nbsp; &nbsp; &nbsp; &nbsp; linq.From(t1.Tags).IntersectByT(linq.From(params), func(str string) string {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return str&nbsp; &nbsp; &nbsp; &nbsp; }).ToSlice(&rs1)&nbsp; &nbsp; &nbsp; &nbsp; var rs2 []string&nbsp; &nbsp; &nbsp; &nbsp; linq.From(t2.Tags).IntersectByT(linq.From(params), func(str string) string {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return str&nbsp; &nbsp; &nbsp; &nbsp; }).ToSlice(&rs2)&nbsp; &nbsp; &nbsp; &nbsp; return len(rs1) > len(rs2)&nbsp; &nbsp; }).ToSlice(&result)&nbsp; &nbsp; fmt.Printf("%+v", result)}[{Name:event1 标签:[美食音乐游戏运动]} {Name:event4 标签:[美食音乐游戏运动]} {Name:event7 标签:[美食游戏运动]} {Name:event3 标签:[音乐运动]} {名称:event5 标签:[音乐编码运动]} {名称:event2 标签:[游戏]} {名称:event6 标签:[编码]}]上面的程序根据您的要求对数组进行排序,希望这会对您有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go