Для этого можно использовать конвейер агрегации mongodb. Я не уверен, почему у вас есть поля ваших листов в виде массива, если он содержит только один объект, содержащий все листы. Я бы предложил следующее:
Sample Do c
{
_id : ObjectId('5eb1116ed99e7c68395d480c'),
sheets : [
{
name : 'Sheet 1',
data : {
headers : [ 'name,mobile,mobile1,mobile2,email1,email2' ],
data_count : 30
}
},
{
name : 'Sheet 2',
data : {
headers : [ 'name,mobile,mobile1' ],
data_count : 20
}
}
]
}
Независимо от этого, вы можете получить желаемый результат с помощью имеющейся у вас схемы применяя несколько $match
и $unwind
к документам, пока вы не получите данные, разделенные на поле _id
и поле sheets
, содержащее только одно значение. Затем вы можете легко сопоставить нужные документы, используя $match
с $or
.
Запрос
db.collection.aggregate([
{
$match : {
_id : {
$in : [ ObjectId('5eb1116ed99e7c68395d479c'), ObjectId('5eb1116ed99e7c68395d480c') ]
}
}
},
{
$unwind : '$sheets'
},
{
$project : {
_id : 1,
sheets : {
$objectToArray : '$sheets'
}
}
},
{
$unwind : '$sheets'
},
{
$unwind : '$sheets.v'
},
{
$match : {
$or : [
{
_id : ObjectId('5eb1116ed99e7c68395d479c'),
'sheets.k' : 'Sheet1'
},
{
_id : ObjectId('5eb1116ed99e7c68395d480c'),
'sheets.k' : 'Sheet2'
}
]
}
},
{
$group : {
_id : null,
data_count : {
$sum : '$sheets.v.data_count'
}
}
}
]);
Тест : Тестовый конвейер агрегации здесь: mongoplayground
Вывод
[
{
"_id": null,
"data_count": 30
}
]