У меня в базе данных 20 миллионов документов следующим образом.
{
"_id": ObjectId("5bb84e931cb3d25a3b21d14e"),
"merchant": "menswearhouse.com",
"category": "Fashion > Clothing > Men's Clothing",
"feature": [
"-0.899652959529",
"-0.02401520125567913",
"0.08394625037908554",
"0.06319021433591843",
"-0.015963224694132805"
]
}
Теперь у меня есть массив ниже, с которым мне нужно найти документы.
const dummy = [
"-0.899652959529",
"-0.02401520125567913",
"0.08394625037908554",
"0.06319021433591843",
"-0.015963224694132805"
];
Мне нужно
- Найти разность всех значений, т.е. необходимо вычесть первый индекс
feature
с первым индексом моего фиктивного массива и так далее для всех 5 значений. - Взять квадратвсех значений
- Добавьте все 5 значений
- Возьмите квадратный корень.
- Сортируйте все значения с этим полем и получите только 5 документов.
Я использую этот запрос, который $project
s поле, когда я использую $limit
.Но мне нужно $sort
с полем $project
ed и мне нужно взять 5 лучших документов.Но есть 20 миллионов документов, которые ничего не возвращают и вечны.
db.collection.aggregate([
{ $project: {
field: {
$sqrt: {
$sum: {
$map: {
input: { $range: [0, { $size: '$feature' }] },
as: "d",
in: {
$pow: [
{
$subtract: [
{ $toDouble: { $arrayElemAt: [dummy, "$$d"] }},
{ $toDouble: { $arrayElemAt: ["$feature", "$$d"] }}
]
},
2
]
}
}
}
}
}
}}
])
Можно ли использовать индекс для поля, которое создается во время выполнения?
Спасибо !!!