#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 —