2016-02-27 3 views
1

Моя задача - писать чат с историей. Поэтому для создания истории мне нужно, чтобы каждый из сообщений отправлялся на Mongodb, и когда у меня есть следующее соединение, мне нужно получить все сообщения и, с циклом, отправить всем клиентам, которые подключены к чатуПолучение элементов из коллекции MongoDB с использованием Golang и mgo

Это код моего чат-сервера

func ChatServer(ws *websocket.Conn) { 

// Connecting to MongoDB, collection History 
session, err := mgo.Dial("mongodb://******:*******@ds045795.mongolab.com:45795/catalog") 
if err != nil { 
    panic(err) 
} 
defer session.Close() 
session.SetMode(mgo.Monotonic, true) 
c := session.DB("catalog").C("History") 

// fmt.Println(c.Find()) 
// Adding clients to the map 
clientId := ws.RemoteAddr().String() 
defer ws.Close() 
clients[ws] = true 

// Loop for receiving msg 
for { 
    var msg string 
    // If can not read msg - delete client from map 
    if err := websocket.Message.Receive(ws, &msg); err != nil { 
     delete(clients, ws) 
     return 
    } 
    sendAll(msg) 
    err = c.Insert(&Connect{clientId, msg}) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 
} 

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

+0

Вы не вставив метку времени с сообщениями? –

+0

Нет, я не вставляю штамп времени –

+0

Итак, как определить «порядок»? Автомагически? –

ответ

0

Прежде всего, я согласен с комментаторами выше - вы должны добавить временную метку к своей структуре Connect. Но даже без него вы можете сортировать свои записи с помощью ObjectID, так как это временная метка. Да, это довольно грязный способ и может cause issues if you use sharding or transfer database to another server, но в вашем случае (один экземпляр Mongolab) это возможно с чем-то вроде как (я не знаю структуру так «IP» и «сообщение» лишь предположение)

var connects []Connect 
c.Find(bson.M{"ip": "127.0.0.1"}).Sort("-_id").Limit(50).All(&connects) // 50 entries in desc order 

for _, connect := range connects { 
    log.Println(connect.Message) 
} 

Но на самом деле добавить время к Connect как то

package main 

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

type Connect struct { 
    Ip  string 
    Message string 
    Ts  time.Time 
} 

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("History") 

    for i := 0; i < 100; i++ { 
     c.Insert(&Connect{"127.0.0.2", fmt.Sprintf("Test message #%d", i), time.Now()}) 
     if err != nil { 
      log.Fatal(err) 
     } 
    } 

    var connects []Connect 
    c.Find(bson.M{"ip": "127.0.0.2"}).Sort("-ts").Limit(50).All(&connects) 

    for _, connect := range connects { 
     log.Println(connect.Message) 
    } 
} 
+0

привет от последнего вопроса. Как я понимаю это к определенному ip, и я хочу отображать все сообщения из коллекции, подобные этому, и следующим образом: [MongoLab Order] (http://oi67.tinypic.com/fpa2z9.jpg) Может быть, я ничего не понимаю ... –

+0

@ ВладДарьев 'c.Find (bson.M {}). Сортировка (« _ id »). Все (& connects)' –

+0

и СНОВА ОЧЕНЬ БОЛЬШОЙ СПАСИБО ВАМ)), может быть, я могу спросить вас иногда не в stackoverflow? Можете ли вы дать мне свои контакты (почту или что-то еще), конечно, если вы не против Потому что вы помогли мне второй раз за два дня)) –

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