亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
瀟湘沐 2022-04-26 16:05:42
我的數據庫中有一些名為"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)但我真的不知道如何像我向你展示的那樣對它們進行排序。
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

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)

}

[{Name:event1 標簽:[美食音樂游戲運動]} {Name:event4 標簽:[美食音樂游戲運動]} {Name:event7 標簽:[美食游戲運動]} {Name:event3 標簽:[音樂運動]} {名稱:event5 標簽:[音樂編碼運動]} {名稱:event2 標簽:[游戲]} {名稱:event6 標簽:[編碼]}]


上面的程序根據您的要求對數組進行排序,希望這會對您有所幫助。


查看完整回答
反對 回復 2022-04-26
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號