У меня возникла ситуация, когда мне нужно выполнить группу по операции на основе значения массива, которое суммирует вхождения значения поля. Затем отсчет фильтруется, и результаты готовятся так, чтобы они отображались в соответствии с условием. По сути, документы преобразуются обратно к тому, как они будут представлены, если вы просто использовали функцию поиска. Я столкнулся с проблемой слишком больших временных документов из-за количества элементов, собранных в массиве matchedDocuments. Любые предложения о том, как улучшить это, будут полезны.Комплекс MongoDB Aggregation
db.collection1.aggregate([
{
'$unwind': '$arrayOfValues'
}, {
'$group': {
'_id': '$arrayOfValues',
'x_count': {
$sum: {
$cond: [{
$eq: ['$field.value', 'x']
},
1, 0
]
}
},
'y_count': {
$sum: {
$cond: [{
$eq: ['$field.value', 'y']
},
1, 0
]
}
},
'matchedDocuments': {
'$push': '$$CURRENT'
}
}
},
{'$match': {'$or': [{'x_count': {'$gte': 2}}, {'y_count': { '$gte': 1}}]}},
{'$unwind': '$matchedDocuments'},
{
'$group': {
'_id': '$matchedDocuments.key',
'document': {
'$last': '$$CURRENT.matchedDocuments'
}
}
}
], {
allowDiskUse: true
})
Ниже приведены некоторые примеры документов и ожидаемый результат на основе вышеуказанных критериев:
// Sample documents
{ "_id" : ObjectId("5407c76b7b1c276c74f90524"), "field" : "x", "arrayOfValues" : [ "a", "b", "c" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90525"), "field" : "x", "arrayOfValues" : [ "b", "c" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90526"), "field" : "z", "arrayOfValues" : [ "a" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90527"), "field" : "x", "arrayOfValues" : [ "a", "c" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90528"), "field" : "z", "arrayOfValues" : [ "b" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90529"), "field" : "y", "arrayOfValues" : [ "k" ] }
// Expected Result
[
{ "_id" : ObjectId("5407c76b7b1c276c74f90524"), "field" : "x", "arrayOfValues" : [ "a", "b", "c" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90525"), "field" : "x", "arrayOfValues" : [ "b", "c" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90527"), "field" : "x", "arrayOfValues" : [ "a", "c" ] }
{ "_id" : ObjectId("5407c76b7b1c276c74f90529"), "field" : "y", "arrayOfValues" : [ "k" ] }
]
Проблема, несомненно, связана с первым ключом группировки. Но поскольку вы группируете значения из массива, который вы только что размотали, трудно понять, что вы на самом деле пытаетесь сделать здесь. Образец документа и ожидаемые результаты обычно лучше всего объясняют ваши намерения. –
Я добавил примеры документов и ожидаемых результатов, чтобы помочь визуализировать проблему. – user1595702
Почему бы просто не посчитать количество документов в массиве 'arrayOfValues'? Это сделало бы агрегацию простой находкой для каждого значения 'field'. – wdberkeley