Reputation: 102
I'm working in go language. I'm using mgo driver to get the data from mongodb. I want last entry from the events array.
There will be huge data in future. so I don't want to read the whole record but just want specific data from the record.
db.events.find({"_id":"59ce53b9-970a-44a2-8419-b41a99120b25"},{"events":{$slice:-1}}).pretty()
this is working in mongo shell. I want this to work in go lang.
This is the sample data, from which I want last entry present in events.
{
"_id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
"version" : 9,
"events" : [
{
"event_type" : "customer:added",
"data" : {
"id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
"name" : "arjun"
},
"timestamp" : ISODate("2017-11-20T12:21:34.910Z"),
"aggregate_type" : "customer",
"_id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
"version" : 1
},
{
"event_type" : "customer:address-updated",
"data" : {
"id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
"address" : "bangalore"
},
"timestamp" : ISODate("2017-11-20T12:22:08.496Z"),
"aggregate_type" : "customer",
"_id" : "59ce53b9-970a-44a2-8419-b41a99120b25",
"version" : 2
}
]
}
Upvotes: 1
Views: 1193
Reputation: 418745
What you pass as the 2nd argument to find()
is a projection.
Projections in mgo
can be specified using the Query.Select()
method.
So your query in mgo
simply looks like this:
sess := ... // Acquire MongoDB session
c := sess.DB("dbname").C("events")
var doc bson.M
err := c.FindId("59ce53b9-970a-44a2-8419-b41a99120b25").
Select(bson.M{"events": bson.M{"$slice": -1}}).
One(&doc)
if err != nil {
// Handle error
}
fmt.Println(len(doc["events"].([]interface{}))) // This prints 1
fmt.Println(doc)
Upvotes: 1