猿问

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

我的数据库中有一些名为“事件”的实体。每个事件都包含一个字符串数组,称为“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)

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


阿波罗的战车
浏览 119回答 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)}[{名称:event1 标签:[美食音乐游戏运动]} {名称:event4 标签:[美食音乐游戏运动]} {名称:event7 标签:[美食音乐游戏运动]} {名称:event3 标签:[音乐运动]} {名称:event5 标签:[音乐编码运动]} {名称:event2 标签:[游戏]} {名称:event6 标签:[编码]}]上面的程序根据您的要求对数组进行排序,希望这会对您有所帮助。
随时随地看视频慕课网APP

相关分类

Go
我要回答