sort - Golang/mgo: ¿Cómo puedo pedirle a MongoDB que use la hora actual en un campo?
mgo mongodb driver (2)
Tengo esta estructura que coincide con los tipos de una colección de MongoDB que estoy usando:
type AppInstance struct {
Id bson.ObjectId "_id,omitempty"
Url string
Priority int
LastSeen string
}
Quiero que el campo LastSeen contenga el tiempo de la última interacción con esa aplicación en particular. Entonces, la aplicación se registra configurando la hora actual (como una cadena).
Lo que me gustaría es que Mongo establezca dinámicamente su propio tiempo actual en ese campo cuando se inserta, tal como lo haría la función NOW () de MySQL.
Tengo esta función auxiliar:
func mongoNow() bson.JavaScript {
return bson.JavaScript{Code:
"return (new Date()).ISODate(''YYYY-MM-DD hh:mm:ss'');"}
}
Y probé esto:
c := mongoSession.DB("myapp").C("instances")
rand.Seed(time.Now().UnixNano())
err := c.Insert(
struct{Id, Serial, Priority, Url, LastSeen interface{}}{
Id: bson.NewObjectId(),
Url: getInformedHost() + ":" + getRunningPortString(),
Priority: rand.Int(),
LastSeen: mongoNow() }
)
checkError(err, "Could not register on MongoDB server.", 3)
el campo LastSeen se almacena como un script en lugar de evaluarse:
[_id] => MongoId Object (
[$id] => 502d6f984eaead30a134fa10
)
[id] => MongoId Object (
[$id] => 502d6f98aa443e0ffd000001
)
[priority] => 1694546828
[url] => 127.0.0.1:8080
[lastseen] => MongoCode Object (
[code] => (new Date()).ISODate(''YYYY-MM-DD hh:mm:ss'')
[scope] => Array (
)
)
Entonces, creo que hay preguntas:
Primero, ¿cómo puedo insertar la hora actual?
En segundo lugar, ¿cómo puedo obtener un javascript evaluado en lugar de insertado?
La respuesta al segundo podría ser suficiente para responder al primero, pero bien podría no serlo.
No almacene el tiempo como cuerda. mgo admite time.Time que es como un objeto Date
en Javascript:
type Event struct {
Id bson.ObjectId "_id,omitempty"
Which string
Date time.Time
}
Inserta un evento que sucedió ahora:
e := Event{
Which: "first event",
Date: time.Now(),
}
c.Insert(e)
En Mongo 2.6 puedes hacerlo de forma nativa con el operador $ currentDate .
db.users.update( { _id: 1 }, {
$currentDate: {
lastModified: true,
lastModifiedTS: { $type: "timestamp" }
},
$set: { status: "D" }
})