2016-02-27 125 views
1

我的任務是與歷史記錄聊天。因此,爲了創建歷史記錄,我需要將每條消息發送到Mongodb,並且當我有下一個連接時,我需要獲取所有消息,並隨循環發送到所有連接到聊天的客戶端。使用Golang和mgo獲取Collection MongoDB中的元素

這是我的ChatServer代碼

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 {})。Sort(「_ id」)。All(&connected)' –

+0

,並且非常感謝你)),也許我可以問你有時不在stackoverflow? 你可以給我你的聯繫方式(郵件或其他東西),當然,如果你不反對 因爲你幫了我第二次在兩天)) –

相關問題