使用 Golang 和 mgo 从 Collection MongoDB 获取元素
Getting the elements from Collection MongoDB using Golang and mgo
我的任务是写聊天记录。因此,为了创建历史记录,我需要将每条消息发送到 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)
}
}
}
所以我的问题 是从集合中按顺序获取所有元素。
我不知道该怎么做,因为在文档中找不到合适的功能。
也许您还有其他优惠?
首先,我同意上面评论者的意见 - 您应该将时间戳添加到您的 Connect
结构中。但即使没有它,您也可以按 ObjectID 对条目进行排序,因为它的一部分是时间戳。是的,这是非常肮脏的方式,可能 cause issues if you use sharding or transfer database to another server 但在你的情况下(单个 Mongolab 实例)可能有类似的东西(我不知道你的结构所以 "ip" 和 "message" 只是假设)
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:123456@ds055855.mlab.com: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)
}
}
我的任务是写聊天记录。因此,为了创建历史记录,我需要将每条消息发送到 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)
}
}
}
所以我的问题 是从集合中按顺序获取所有元素。 我不知道该怎么做,因为在文档中找不到合适的功能。 也许您还有其他优惠?
首先,我同意上面评论者的意见 - 您应该将时间戳添加到您的 Connect
结构中。但即使没有它,您也可以按 ObjectID 对条目进行排序,因为它的一部分是时间戳。是的,这是非常肮脏的方式,可能 cause issues if you use sharding or transfer database to another server 但在你的情况下(单个 Mongolab 实例)可能有类似的东西(我不知道你的结构所以 "ip" 和 "message" 只是假设)
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:123456@ds055855.mlab.com: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)
}
}