如何使用mgo和Golang编写以下Mongo聚合查询:

huangapple go评论91阅读模式
英文:

How do I write the following Mongo Aggregation Query using mgo with Golang

问题

我有以下查询,我已经测试过并且有效,但是mgo查询似乎有问题:

  1. var userId = "57a944390b1acf0d069388c1";
  2. db.users.aggregate([
  3. { "$match": { "_id": userID } },
  4. { "$unwind": "$groups" },
  5. {
  6. "$lookup": {
  7. "from": "groups",
  8. "localField": "groups.id",
  9. "foreignField": "_id",
  10. "as": "group"
  11. }
  12. },
  13. { "$unwind": "$group" },
  14. {
  15. "$project": {
  16. "group.requests": {
  17. "$filter": {
  18. "input": "$group.requests",
  19. "as": "item",
  20. "cond": {
  21. "$and": [
  22. { "$ne": ["$$item.user_id", userID] },
  23. { "$not": {
  24. "$setIsSubset": [
  25. [userID], "$$item.denied_users"
  26. ]
  27. }}
  28. ]
  29. }
  30. }
  31. }
  32. }
  33. },
  34. { "$unwind": "$group.requests" }
  35. ])

mgo查询如下:

  1. c := session.DB(info.Db()).C("users")
  2. o1 := bson.M{"$match": bson.M{"_id": userID}}
  3. o2 := bson.M{"$unwind": "$groups"}
  4. o3 := bson.M{"$lookup": bson.M{
  5. "from": "groups",
  6. "localField": "groups.id",
  7. "foreignField": "_id",
  8. "as": "group",
  9. }}
  10. o4 := bson.M{"$unwind": "$group"}
  11. o5 := bson.M{
  12. "$project": bson.M{
  13. "group.requests": bson.M{
  14. "$filter": bson.M{
  15. "input": "$group.requests",
  16. "as": "item",
  17. "cond": bson.M{
  18. "$and": []bson.M{
  19. bson.M{"$ne": []string{"$$item.user_id", userID}},
  20. bson.M{"$not": bson.M{
  21. "$setIsSubset": []interface{}{
  22. []string{userID},
  23. []string{"$$item.denied_users"},
  24. },
  25. }},
  26. },
  27. },
  28. },
  29. },
  30. },
  31. }
  32. o6 := bson.M{"$unwind": "$group.requests"}
  33. pipeline := []bson.M{o1, o2, o3, o4, o5, o6}

我猜测$filter部分有问题。具体来说,我指定的$setIsSubset和参数与上面的实际mongo查询不匹配。如果我删除该部分($not内的所有内容),那么它可以工作(尽管不是正确的过滤器)。

我基本上需要将上面的查询翻译成mgo语法。

英文:

I have the following query which I have tested and works, but the mgo

  1. var userId = "57a944390b1acf0d069388c1";
  2. db.users.aggregate([
  3. { "$match": { "_id": userID } },
  4. { "$unwind": "$groups" },
  5. {
  6. "$lookup": {
  7. "from": "groups",
  8. "localField": "groups.id",
  9. "foreignField": "_id",
  10. "as": "group"
  11. }
  12. },
  13. { "$unwind": "$group" },
  14. {
  15. "$project": {
  16. "group.requests": {
  17. "$filter": {
  18. "input" : "$group.requests",
  19. "as" : "item",
  20. "cond": { "$and" : [
  21. { "$ne" : ["$$item.user_id", userID] },
  22. { "$not" : {
  23. "$setIsSubset" : [
  24. [userID], "$$item.denied_users"
  25. ]
  26. }
  27. }
  28. ]
  29. }
  30. }
  31. }
  32. }
  33. },
  34. { "$unwind" : "$group.requests" }
  35. ])

The mgo query looks like the following:

  1. c := session.DB(info.Db()).C("users")
  2. o1 := bson.M{"$match": bson.M{"_id": userID}}
  3. o2 := bson.M{"$unwind": "$groups"}
  4. o3 := bson.M{"$lookup": bson.M{
  5. "from": "groups",
  6. "localField": "groups.id",
  7. "foreignField": "_id",
  8. "as": "group",
  9. }}
  10. o4 := bson.M{"$unwind": "$group"}
  11. o5 := bson.M{
  12. "$project": bson.M{
  13. "group.requests": bson.M{
  14. "$filter": bson.M{
  15. "input": "$group.requests",
  16. "as": "item",
  17. "cond": bson.M{
  18. "$and": []bson.M{
  19. bson.M{"$ne": []string{"$$item.user_id", userID}},
  20. bson.M{"$not": bson.M{
  21. "$setIsSubset": []interface{}{
  22. []string{userID},
  23. []string{"$$item.denied_users"},
  24. },
  25. }},
  26. },
  27. },
  28. },
  29. },
  30. },
  31. }
  32. o6 := bson.M{"$unwind": "$group.requests"}
  33. pipeline := []bson.M{o1, o2, o3, o4, o5, o6}

My guess is that the $filter is not working. Specifically, the way I am specifying the $setIsSubset and arguments to that are not matching the actual mongo query above it. If I remove that section (everything within the $not, then it works (aside from not being the correct filter).

I basically need the top query translated into mgo.

答案1

得分: 1

"$setIsSubset": []interface{}{
[]string{userID},
[]string{"$$item.denied_users"},
},

等同于

"$setIsSubset" : [
[userID], ["$$item.denied_users"]
]

所以我认为你需要这样定义:

"$setIsSubset": []interface{}{
[]string{userID},
"$$item.denied_users",
},

英文:
  1. "$setIsSubset": []interface{}{
  2. []string{userID},
  3. []string{"$$item.denied_users"},
  4. },

is equal to

  1. "$setIsSubset" : [
  2. [userID], ["$$item.denied_users"]
  3. ]

so I think you need to define it like

  1. "$setIsSubset": []interface{}{
  2. []string{userID},
  3. "$$item.denied_users",
  4. },

huangapple
  • 本文由 发表于 2016年8月20日 12:32:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/39050499.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定