$ group с $ lookup - PullRequest
       5

$ group с $ lookup

0 голосов
/ 30 июня 2018

У меня вопрос в запросе MongoDB. У меня есть следующая коллекция пользователей:

{
    "_id" : ObjectId("5aa03bf97d6e1d28a020f488"),
    "name":"A1",
     "interests" : [ 
        ObjectId("5aa03b877d6e1d28a020f484"), 
        ObjectId("5aa03bb47d6e1d28a020f485")
    ]
},
{
    "_id" : ObjectId("5affd69339f67335303ddf77"),
    "name":"A2",
     "interests" : [ 
        ObjectId("5aa03b877d6e1d28a020f484")
    ]
},
{
    "_id" : ObjectId("5affd69339f673ddfjfhri45"),
    "name":"A3",
     "interests" : [ 
        ObjectId("5aa03bb47d6e1d28a020f485"), 
    ]
},
{
    "_id" : ObjectId("5affd69339f67365656ddfg4f"),
    "name":"A4",
     "interests" : [ 
        ObjectId("5aa16eb8890cbb4c582e8a38"), 
    ]
}

Коллекция интересов выглядит следующим образом:

{
    "_id" : ObjectId("5aa16eb8890cbb4c582e8a38"),
    "name" : "Swimming",
},
{
    "_id" : ObjectId("5aa03bb47d6e1d28a020f485"),
    "name" : "Basketball",
},
{
    "_id" : ObjectId("5aa03b877d6e1d28a020f484"),
    "name" : "Fishing",
}

Я хочу написать запрос, который учитывает типы интересов всех пользователей: ожидаемый результат как:

 [
    {
        "name":"fishing"
        "count":21 
    },
    {
        "name":"Basketball"
        "count":15
    }
]

Спасибо за помощников:)

Ответы [ 2 ]

0 голосов
/ 30 июня 2018
 db.collection.aggregate(
  {
    $group: {
      _id: '$interests'
    }
  },
  {
    $group: {
      _id: '$name',
      count: {
        $sum: 1
      }
    }
  }
)
0 голосов
/ 30 июня 2018

Если у вас mongodb 3.6, вы можете попробовать агрегацию ниже

db.collection.aggregate([
  { "$lookup": {
    "from": Intrest.collection.name,
    "let": { "interests": "$interests" },
    "pipeline": [
      { "$match": {
        "$expr": { "$in": [ "$_id", "$$interests" ] },
        "name": "Swimming",
      }}
    ],
    "as": "interests"
  }},
  { "$unwind": "$interests" },
  { "$group": {
    "_id": "$interests.name",
    "count": { "$sum": 1 }
  }},
  { "$project": {
    "name": "$_id", "count": 1
  }}
])

А если вы хотите группировать с интересами name

db.collection.aggregate([
  { "$lookup": {
    "from": Intrest.collection.name,
    "let": { "interests": "$interests" },
    "pipeline": [
      { "$match": { "$expr": { "$in": [ "$_id", "$$interests" ] } }}
    ],
    "as": "interests"
  }},
  { "$unwind": "$interests" },
  { "$group": {
    "_id": "$interests.name",
    "count": { "$sum": 1 }
  }},
  { "$project": {
    "name": "$_id", "count": 1
  }}
])
...