2016-10-26 1 views
2

У меня есть следующий запрос в MongoDB -Монго агрегация запрос в golang с водителем ЕГО

db.devices.aggregate({ 
$match: {userId: "v73TuQqZykbxFXsWo", state: true}}, 
{ 
    $project: { 
    userId: 1, 
    categorySlug: 1, 
    weight: { 
     $cond: [ 
     {"$or": [ 
      {$eq: ["$categorySlug", "air_fryer"] }, 
      {$eq: ["$categorySlug", "iron"] } 
     ] }, 
     0, 1] } 
    } }, 
    {$sort: {weight: 1}}, 
    { $limit : 10 } 
); 

Я пытаюсь написать в golang, используя драйвер ЕГО, но не в состоянии обернуть мою голову вокруг этого на все !

Как перевести это на запрос golang mgo?

+0

Просто разделить каждую сцену и use'bson.M {} ', чтобы обернуть вокруг каждого уровня гнезда вашего запроса с кавычками, что-то вроде:' match: = bson.M {"$ match": bson.M {"userId": "...", ...}} ', затем' project: = bson.M {"$ project" ...} '. Теперь используйте mgo driver 'Pipe' с такими, как' pipe: = collection.Pipe ([] bson.M {match, project}) 'и, наконец, получить результат с помощью' pipe.All (& yourResultStruct) '. Прочтите их документы 'Pipe' [здесь] (https://godoc.org/labix.org/v2/mgo#Collection.Pipe) – Anzel

ответ

2

Примеров для документов достаточно для начала работы. Однако, если вы не знакомы с golang, часть $cond может быть немного сложной. Ниже пример кода:

collection := session.DB("dbName").C("devices") 

    stage_match := bson.M{"$match":bson.M{"userId":"v73TuQqZykbxFXsWo", "state": true}} 

    condition_weight := []interface{}{bson.M{"$or": []bson.M{ 
         bson.M{"$eq": []string{"$categorySlug", "air_fryer"}}, 
         bson.M{"$eq": []string{"$categorySlug", "iron"}}, 
    }}, 0, 1} 

    stage_project:= bson.M{"$project": bson.M{"userId":1, "categorySlug":1, "weight": condition_weight}} 

    stage_sort := bson.M{"$sort": bson.M{"weight":1}} 

    stage_limit := bson.M{"$limit": 10} 

    pipe := collection.Pipe([]bson.M{stage_match, stage_project, stage_sort, stage_limit}) 

Смотрите также mgo: type Pipe

+0

Благодарим вас за подробный ответ. Да, вы поняли, что я не в состоянии правильно перевести различные части в запросе агрегирования. Престижность! –

+0

Мне нужно было внести незначительную корректировку в запрос по строкам этого - http://stackoverflow.com/questions/27686914/behaviour-of-the-project-stage-operator-in-projecting-arrays, чтобы сделать он работает в моем случае. В stage_project параметр «вес» должен быть определен как «вес»: bson.M {"$ literal": condition_weight} –

Смежные вопросы