Javascript 按动态添加字段排序
我的数据库中有2000万个文档,它们的方式如下Javascript 按动态添加字段排序,javascript,node.js,mongodb,sorting,aggregation-framework,Javascript,Node.js,Mongodb,Sorting,Aggregation Framework,我的数据库中有2000万个文档,它们的方式如下 { "_id": ObjectId("5bb84e931cb3d25a3b21d14e"), "merchant": "menswearhouse.com", "category": "Fashion > Clothing > Men's Clothing", "feature": [ "-0.899652959529", "-0.02401520125567913",
{
"_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"
];
我需要
功能的第一个索引,依此类推所有5个值
$limit
时,该查询将$project
替换字段。但是我需要使用$project
ed字段对$sort
进行排序,并需要获取前5个文档。但是有两千万份文件,它不会返回任何东西,而且会一直持续下去
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
]
}
}
}
}
}
}}
])
我可以在运行时创建的字段上使用索引吗
谢谢 简短的回答是否。您不能在运行时创建的字段上创建索引。撰写本文时,MongoDB无法实现您想要的。但是你可以并行计算它们。假设您的服务器有适当的资源(CPU和内存),您可以在应用程序中划分作业并并行执行它们。对于简单的数学,假设您有20000000(mil)个文档,并将它们划分为20个任务。对于每个任务,它将处理1000000个文档并返回前5个结果。第一个任务的管道将是
[
{
'$sort': {
'_id': 1
}
}, {
'$skip': 0
}, {
'$limit': 1000000
}, {
'$project': {
'field': {
'$sqrt': {
<do your thing>
}
}
}
}, {
'$limit': 5
}
]
[
{
“$sort”:{
“_id”:1
}
}, {
“$skip”:0
}, {
“$limit”:1000000
}, {
“$project”:{
“字段”:{
“$sqrt”:{
}
}
}
}, {
“$limit”:5
}
]
返回所有线程(任务)后,将结果(仅100个文档)合并到应用程序中,按
字段对它们进行排序,最后获得前5个文档。请注意,您必须考虑硬件资源才能得到最佳的划分任务数量。您可以提供当前的收集索引吗?HI @ JonathanMuller I现在没有创建任何索引。我需要创造吗?事实上,这不会有多大帮助。我要求有更多的背景来准备答案。你的问题很复杂还有几个问题:你能详细说明“全部添加128个值”吗?“取所有值的平方”=>包含在“功能”数组中的值的平方或“功能”和“虚拟”数组之间所有差异的平方?“功能”和“虚拟”数组总是包含5个元素?20个任务包含100000个文档,1个任务包含2000000个文档有什么区别?@Profer,关键是同时运行20个任务。您必须使用支持多线程或异步的编程语言。