Javascript 如何在DB mapreduce中按长度对键进行排序?
我正在开发一个搜索IPFS中托管的集合的工具 我使用PockDB存储路径和IPFS ID之间的映射。我正在使用的界面是自动完成的。我的数据库中的每个对象都类似于:Javascript 如何在DB mapreduce中按长度对键进行排序?,javascript,mapreduce,pouchdb,Javascript,Mapreduce,Pouchdb,我正在开发一个搜索IPFS中托管的集合的工具 我使用PockDB存储路径和IPFS ID之间的映射。我正在使用的界面是自动完成的。我的数据库中的每个对象都类似于: { path: ['path', 'to', 'blob'], ipfs_id: 'Qem4u234jk34k…', } 我有一个设计文档,它打印了通向条目的所有子路径: const ddoc = { views: { all: { // emit confuses webpack in produc
{
path: ['path', 'to', 'blob'],
ipfs_id: 'Qem4u234jk34k…',
}
我有一个设计文档,它打印了通向条目的所有子路径:
const ddoc = {
views: {
all: {
// emit confuses webpack in production
map: (
'function(doc) {'
+ 'for(i in doc.path) {'
+ 'var path = doc.path.slice(0,i+1).join("/");'
+ 'emit(path, null);'
+ '}'
+ '}'
),
reduce: function(keys, values, rereduce) {
return 1 // uniqueness
}.toString(),
},
},
}
我的自动完成功能如下所示:
db.query(
'paths/all',
{
startkey: search,
endkey: `${search}\uFFFF`,
limit: 25,
group: true,
}
)
我想按长度对键进行排序,以便先完成部分
我目前的理解是这是不可能的,我需要切换到在对象中存储路径长度,并为中间路径创建文档。然后,我可以使用排序进行Mango$gte
查询
或者,我可以尝试中的一些方法,但我的路径元素不是全局唯一的,因此我必须分配节点GUID并从这些GUID构建路径。我为根和叶之间的中间节点向数据库添加了节点,并将每个路径的深度存储在文档中。(最初的设计只有叶径。) 我还将序列化路径设置为文档
\u id
现在,我正在使用Mango查询进行完成搜索:
db.find({
selector: {
_id: {
$gt: search,
$lte: `${search}\uFFF0`,
},
depth: { $gt: null },
},
sort: ['depth'],
limit: MAX_RESULTS,
})
它可以工作,但需要几秒钟才能返回。您的搜索词是否包含路径分隔符?