Pouchdb 如何使用数据库查找为对象数组创建可用索引?
我只想获取至少与其中一个GroupID匹配的组的数据。我尝试了一些解决方案,但我还是做错了。假设我们有这样的数据Pouchdb 如何使用数据库查找为对象数组创建可用索引?,pouchdb,Pouchdb,我只想获取至少与其中一个GroupID匹配的组的数据。我尝试了一些解决方案,但我还是做错了。假设我们有这样的数据 const groupIDs = ['124', '245', '678', '999', '111']; const data = [ { _id: 'example:123', _rev: 'example', name: 'John', groups: [ { groupID: '124', type: 'ADMIN' },
const groupIDs = ['124', '245', '678', '999', '111'];
const data = [
{
_id: 'example:123',
_rev: 'example',
name: 'John',
groups: [
{ groupID: '124', type: 'ADMIN' },
{ groupID: '345', type: 'PRACTITIONER' },
{ groupID: '678', type: 'PATIENT' },
]
},
{
_id: 'example:456',
_rev: 'example2',
name: 'Yoda',
groups: [
{ groupID: '124', type: 'ADMIN' },
{ groupID: '345', type: 'PRACTITIONER' }
]
},
];
这是我的尝试:
db.createIndex({
index: { fields: ['groups.[].groupID'] }
})
.then((result) => {
db.find({
selector: { groups.groupID: { $in: groupIDs } },
use_index: results.name
})
})
以下是使用芒果达到预期效果的众多方法之一。我还提供了一个示例Map/Reduce 对于Mango,亮点是创建索引和选择器。指数是这样的
db.createIndex({
index: {
fields: ['groups'],
ddoc: 'my-index'
}
});
注:我更喜欢命名索引(ddoc)
因此,我们需要使用数组字段的组合运算符,其中包括$in
和$elemMatch
运算符
从CouchDB查找文档[1]:
$elemMatch运算符匹配并返回包含
至少有一个元素与提供的查询匹配的数组字段
标准
此外,文档中的$
文档字段必须存在于提供的列表中
太好了!让我们使用$elemMatch
和$in
组合运算符在组
数组中查找一组GroupID
selector: {
groups: {
$elemMatch: {
groupID: { $in: groupIDs }
}
}
下面的代码片段演示了使用上述选择器的芒果查询和使用键的Map/Reduce解决方案
查询选项
两者之间的显著性是Map/Reduce为每个匹配生成一个文档,这意味着可能存在冗余文档;如果芒果结果集匹配一次或多次,则返回一个文档
//方便
const-gel=id=>document.getElementById(id);
const all_docs='allDocs';
const groups_groupID='groupID';
const groups_groupIDView='groupIDView';
const g_view_result='view_result';
const g_groupIdHints='groupIdHints';
常量queryFns={};
//显示本示例中使用的所有文档。
queryFns[all_docs]=()=>db.allDocs({
包含文档:true
});
//Mango-在groups数组中查找一个或多个GroupID。
//@groupIDs是一个或多个值的数组。
queryFns[groups\u groupID]=(groupID/*数组*/)=>{
常量查询={
选择器:{
小组:{
$elemMatch:{
groupID:{
$in:groupid
}
}
}
},
使用索引:“我的索引”
}
返回db.find(查询);
}
//Map/Reduce-查询GroupId视图中的一个或多个GroupId
//@groupIDs是一个或多个值的数组。
queryFns[groups\u groupIDView]=(groupIDs/*array*/)=>db.query(
组\组ID视图{
包含文档:true,
减少:错,
关键字:groupid
});
//执行queryFns中命名的查询
const query=async(fnName,csv)=>{
常量html=[];
常量视图结果=凝胶(g视图结果);
试一试{
//将csv转换为数组
const groupIds=(csv | |').split(',).map(id=>id.trim());
let docs=wait queryfnns[fnName](groupid);
//确保文档是一组文档(例如db.allDocs vs db.find result)
//请注意,所谓的“Tidy”函数会破坏null coalesce运算符
docs=docs.rows??docs.docs;
push(`Matches:${docs.length | | 0}`);
//收集文档以供查看
docs.forEach(doc=>
html.push(`
显示所有文档
查找组ID:
芒果
查找组ID:
映射/还原
输入groupID的CSV,例如。
mango方法目前仍在运行,但尚未尝试map/reduce方法。顺便问一下,您的mango方法是否假设groupID为单个值或数组?因为它给了我一个错误,告诉我“groupID”不是$eq、$elemMatch等中的一个。这是错误:错误:未知运算符“groupID”-应该是$eq、$lte、$lt、$gt、$gte、$exists、$ne、$in、$nin、$size、$mod、$regex、$elemMatch、$type、$allMatch或$all
@HudRosli确实,我已经相应地修改了答案。