монго подсчитывает строки из массива предоставленных данных

#mongodb

#mongodb

Вопрос:

У меня есть такая коллекция:

 { 
   "_id" : ObjectId("4d663451d1e7242c4b68e000"), 
  "topic" : "abc", 
  "subLevel" : {
     "id" : 1
  }
}
{ 
    "_id" : ObjectId("4d6634514cb5cb2c4b69e000"), 
    "topic" : "bce", 
    "subLevel" : {
        "id" : 1
     }
}

{ 
    "_id" : ObjectId("4d6634514cb5cb2c4b70e000"), 
    "topic" : "bec", 
    "subLevel" : {
        "id" : 2
     }
}
{ 
    "_id" : ObjectId("4d6634514cb5cb2c4b70e000"), 
    "topic" : "vvv", 
    "subLevel" : {
        "id" : 3
     }
}
 

и мне нужно подсчитать, сколько документов существует для предоставленных subLevel.id список, например, если я предоставлю 1 и 2, он должен показать мне, что для 1 у нас есть 2 документа, а для 2 только 1 документ, и просто опустить документ, где subLevel.id равно 3, так как его нет в списке идентификаторов’s.

Я попытался сделать это с помощью агрегата

 db.getCollection('products').aggregate( [
   { $project: 
       {  "has_sublevel" : {$in: [ "subLevel.id", [1 , 2 ]]} }
   },
   { $group: { _id : "$subLevel.id", count: { $sum: 1 } } }
] )
 

но результат

 {
   _id : null,
   count: 4
}
 

как я могу это сделать, заранее спасибо!

Если преобразовать его в SQL, с которым я знаком больше, запрос должен выглядеть следующим образом:

 select subLevelId, count(id) FROM products where subLevelId in (1,2) group by subLevelId
 

Комментарии:

1. { "has_sublevel" : {$in: [ "subLevel.id", [1 , 2 ]]} } возвращает значение {has_sublevel: true} (или false), т. Е. Поле subLevel.id больше не существует после $project . Возможно, замена $project на $set которые сохранит существующие поля.

Ответ №1:

Если я правильно понял, вы так близки, проверьте этот запрос:

  • Сначала используйте $match , чтобы получить только документы, число которых subLevel.id равно 1 или 2.
  • Затем, как вы уже сделали, $group с помощью id и sum, чтобы получить общее количество:
 db.collection.aggregate([
  {
    "$match": { "subLevel.id": { "$in": [ 1, 2 ] } }
  },
  {
    "$group": { "_id": "$subLevel.id", "count": { "$sum": 1 } }
  }
])
 

Пример здесь

Ответ №2:

Вам понадобится это:

 db.products.aggregate([  {$match:{ "subLevel.id":{ $in:[1,2]  } }}   , {$group:{ _id:"$subLevel.id" , count:{$sum:1}   } }   ])
 

который такой же, как:

 db.products.aggregate([  {$match:{ $or:[{"subLevel.id":1},{"subLevel.id":2}   ]}}   , {$group:{ _id:"$subLevel.id" , count:{$sum:1}   } }   ])
 

Ответ №3:

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

 db.collection.aggregate([
  {
    "$match": {
      "subLevel.id": {
        $in: [
          1,
          2
        ]
      }
    }
  },
  {
    $group: {
      "_id": "$subLevel.id",
      ids: {
        $push: "$_id"
      }
    }
  },
  {
    $project: {
      _id: false,
      ids: {
        $size: "$ids"
      }
    }
  }
])
 

Режим воспроизведения: https://mongoplayground.net/p/J1ei37l1K5 —