2016-04-05 4 views
0

Предположим, у меня есть следующую структурусортировать MongoDB запрос на основе поля в поддокументе в Go

type Test struct { 
    Title string `bson:"title" json:"title"` 
    Update Update `bson:"update" json:"update"` 
} 

type Update struct { 
    Changes []string `bson:"change" json:"change"` 
    UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` 
} 

И предположим, что я хочу, чтобы отсортировать мои результаты в запросе на «update.updatedAt»

cs.Find(bson.M{title: "some title"}).Sort("-update.updatedAt").Limit(10).All(&results) 

Этот запрос не работает должным образом. Кажется, я не могу найти документацию о том, как сортировать запрос по полю вложенного документа. Интуитивно я был уверен, что мой пример будет работать. Для справки, «-updatedAt» работает очень хорошо, но по причинам, которые не нужны для объяснения, я должен постоянно обновлять как поддокумент Test.

Каждый пример и вопрос переполнения стека, который я видел до сих пор, включают сортировку и переупорядочение поддокументов или массивов. В этом случае меня не интересует порядок моих поддокументов, и я не разбираюсь ни в чем внутри массива. Я просто хочу отсортировать документы по дате субдокумента.

Есть ли способ сделать это с помощью библиотеки запросов Go Mgo Query?

ответ

1

Я уверен, что это что-то с вашими структурами данных, потому что следующий код работает, как ожидалось (вы можете проверить его на компьютере)

package main 

import (
    "fmt" 
    "gopkg.in/mgo.v2" 
    "gopkg.in/mgo.v2/bson" 
    "log" 
    "time" 
) 

type Test struct { 
    Title string `bson:"title" json:"title"` 
    Update Update `bson:"update" json:"update"` 
} 

type Update struct { 
    Changes []string `bson:"change" json:"change"` 
    UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` 
} 

func main() { 
    session, err := mgo.Dial("mongodb://souser:[email protected]:55855/catalog") 

    if err != nil { 
     panic(err) 
    } 
    defer session.Close() 
    session.SetMode(mgo.Monotonic, true) 

    c := session.DB("catalog").C("sortable") 

    /* 
     // Fill collection with test data (test collection aready has 15 elements) 
     for i := 0; i < 15; i++ { 
      c.Insert(&Test{ 
       Title: "Title", 
       Update: Update{ 
        Changes: []string{fmt.Sprintf("Changes #%d", i)}, 
        UpdatedAt: time.Now(), 
       }, 
      }) 
     } 
    */ 

    var results []Test 

    err = c.Find(bson.M{"title": "Title"}).Sort("-update.updatedAt").Limit(10).All(&results) 
    if err != nil { 
     log.Fatal(err) 
    } 

    for _, e := range results { 
     fmt.Println(e.Update.UpdatedAt) 
    } 
} 
+0

Вы абсолютно правы. Спасибо, что нашли время, чтобы собрать это вместе. – Quest

Смежные вопросы