Pouchdb 如何使用数据库查找为对象数组创建可用索引?

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' },

我只想获取至少与其中一个GroupID匹配的组的数据。我尝试了一些解决方案,但我还是做错了。假设我们有这样的数据

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确实,我已经相应地修改了答案。