В итоге сам разобрал ошибку, возможно кому пригодится решение
Nodejs + Mongo + Mongoose
К примеру - Есть набор статей, у каждой статьи есть несколько тематических тегов.
Требуется сделать сортировку по несколько одновременно выбранным тегам
Решение: при создании статьи добавляем к ней тематические теги. На беке к каждому указанному тегу, добавляем id созданой статьи
Теперь у каждого тега в базе есть массив с id всех статей с этим тегом
Что бы получить все статьи содержащие несколько выбранных тегов
Нам надо найти эти теги в базе, и найти в их массивах статей, все совпадающие id
// пример документа Тега
{
_id: "5b93e8a9c2c6bf1cd44144a0",
name: name,
articles: [
'5b93e843c2c6bf1cd4414490',
'5b93e849c2c6bf1cd4414491',
'5b93e84dc2c6bf1cd4414492',
'5b93e852c2c6bf1cd4414493',
'5b93e857c2c6bf1cd4414494',
'5b93e85dc2c6bf1cd4414495',
'5b93e862c2c6bf1cd4414496',
'5b93e867c2c6bf1cd4414497',
]
}
// для примера это id тегов в базе получиные с клиента на бек
var tagsID [
'5b93e8a9c2c6bf1cd44144a0',
'5b93e8b4c2c6bf1cd44144a1',
'5b93e8bac2c6bf1cd44144a2',
'5b93e8c0c2c6bf1cd44144a3',
'5b93e8c6c2c6bf1cd44144a4',
]
// https://stackoverflow.com/questions/30646534/how-to-find-set-intersection-of-sets-between-the-documents-in-a-single-collectio
// тут был описан код сортировки, и моя проблема была в том, что надо было преобразовать id тегов для mongoose
var convertTagsForAggregate = [];
for (var i = 0; i < tagsID.length; i++) {
convertTagsForAggregate.push(mongoose.Types.ObjectId(tagsID[i]))
}
Tags.aggregate([
{
"$match": {
"_id": { "$in": convertTagsForAggregate}
}
},
{
"$group": {
"_id": 0,
"sets": { "$push": "$articles" }, // articles - название ключа массива с id статей
"initialSet": { "$first": "$articles" } // articles - название ключа массива с id статей
}
},
{
"$project": {
"commonSets": {
"$reduce": {
"input": "$sets",
"initialValue": "$initialSet",
"in": { "$setIntersection": ["$$value", "$$this"] }
}
}
}
}
], function (err, result) {
console.log(result)
})