2017-11-15 1 views
2

에 나는이 같은 MongoDB를 수집 것을해야하는 방법 : 그것이 "device_id"에 의해 별개로 내가 원하는MongoDB를 집계가 golang

{ "_id" : ObjectId("5a017ee061313781045889ea"), "device_id" : "1232213", "value" : "23233", "pubtime" : ISODate("2017-11-07T09:37:37.006Z") } 
{ "_id" : ObjectId("5a017f7b61313781045889eb"), "device_id" : "1111", "value" : "23233", "pubtime" : ISODate("2017-11-07T09:40:11.204Z") } 
{ "_id" : ObjectId("5a017fdd61313781045889ec"), "device_id" : "12222", "value" : "23233", "pubtime" : ISODate("2017-11-07T09:41:49.452Z") } 
{ "_id" : ObjectId("5a017ff561313781045889ed"), "device_id" : "1232213", "value" : "23233", "pubtime" : ISODate("2017-11-07T09:42:13.658Z") } 

"pubtime"하여 정렬합니다.

나는 골란이 그것을하기 위해 파이프를 사용할 수 있음을 알고 있습니다. 그러나 나는 그것을 어떻게하는지 모른다. 내가 시도한 것 :

o1 := bson.M{"_id": bson.M{"device_id": "$device_id"}} 

o2 := bson.M{"pubtime": bson.M{"$last": "$pubtime"}} 
o3 := bson.M{"$group": []bson.M{o1, o2}} 
pipe := c.Pipe([]bson.M{o3}) 
var result = []bson.M{} 
_ = pipe.All(&result) 
fmt.Println(result) 

결과가 비어 있습니다.

는 MongoDB를에 괜찮 :

db.collections.aggregate({"$group": 
         {"_id":{"device_id":"$device_id"}, 
         "pubtime":{"$last": "$pubtime"} , 
         "value":{"$last": "$value"} , 
         }}); 
+0

o1 := bson.M{"_id": bson.M{"device_id": "$device_id"}} o2 := bson.M{"pubtime": bson.M{"$last": "$pubtime"}} o3 := bson.M{"$group": []bson.M{o1, o2}} \t pipe := c.Pipe([]bson.M{o3}) var result []bson.M{} _ = pipe.All(&result) fmt.Println(result)
그것은 빈 얻을 수 있었다. –

답변

1

오류를 확인하지 않으므로 이것이 주된 문제입니다. Pipe.All()은 정상적으로 삭제 한 오류를 반환합니다. 그러지 마.

var result = []bson.M{} 
err := pipe.All(&result) 
fmt.Println(result, err) 

이 인쇄됩니다 :

[] a group's fields must be specified in an object 

오류가 모든 것을 말한다. $group의 값은 예 : bson.M 값, 그리고 bson.M의 조각 :

o3 := bson.M{"$group": bson.M{ 
    "_id":  bson.M{"device_id": "$device_id"}, 
    "pubtime": bson.M{"$last": "$pubtime"}, 
}} 
pipe := c.Pipe([]bson.M{o3}) 
var result = []bson.M{} 
err := pipe.All(&result) 
fmt.Println(result, err) 

이제 출력은 다음과 같습니다

[map[_id:map[device_id:12222] pubtime:2017-11-07 10:41:49.452 +0100 CET] map[_id:map[device_id:1111] pubtime:2017-11-07 10:40:11.204 +0100 CET] map[_id:map[device_id:1232213] pubtime:2017-11-07 10:42:13.658 +0100 CET]] <nil>

그래서 그것은 작동합니다.

결과를 pubtime으로 정렬하려면 $sort을 사용하십시오. '

{"$sort": bson.M{"pubtime": -1}} 

는 또한 그룹화 할 때 그룹 _id가 하나의 필드의 경우, 당신은 돈주의 : 당신이 내림차순으로 정렬 결과를 원하는 경우에

pipe := c.Pipe([]bson.M{ 
    { 
     "$group": bson.M{ 
      "_id":  bson.M{"device_id": "$device_id"}, 
      "pubtime": bson.M{"$last": "$pubtime"}, 
     }, 
    }, 
    {"$sort": bson.M{"pubtime": 1}}, 
}) 
var result = []bson.M{} 
err := pipe.All(&result) 
fmt.Println(result, err) 

는 다음 사용 : 여기에 최종 코드의 t는 단순히 그룹 ID로 $device_id를 사용할 수있는 객체로 포장해야합니다

"$group": bson.M{ 
    "_id":  "$device_id", 
    "pubtime": bson.M{"$last": "$pubtime"}, 
}, 
+0

Thx 많이! Thx 많이! Thx 많이! Thx 많이! –

0
그것은 MongoDB를 집계 파이프 라인에 $group$first을 사용하여 수행 할 수 있습니다

MongoDB의 쉘 쿼리

db.collection.aggregate([ 
    {$group: {_id:{device_id:"$device_id"}, pubtime:{$first:"$pubtime"}}} 
]); 

우리가 실행 한 후 얻을 결과 위의 쿼리는 mongo shell

{ "_id" : { "device_id" : "12222" }, "pubtime" : ISODate("2017-11-07T09:41:49.452Z") } 
{ "_id" : { "device_id" : "1111" }, "pubtime" : ISODate("2017-11-07T09:40:11.204Z") } 
{ "_id" : { "device_id" : "1232213" }, "pubtime" : ISODate("2017-11-07T09:37:37.006Z") } 
+0

죄송합니다, 골란하는 법을 알고 싶습니다. –

+0

Mongodb 쉘이 괜찮습니다. –