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

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

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

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

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 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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