如何使用PouchDB-Find获取特定数据(从数组中)

7

CouchDB文档:

  "members": [
    {
      "name": "Mark",
      "age": 35,
    },
    {
      "name": "Bill",
      "age": 32,
    }
  ]

使用PouchDB-Find从PouchDB中查询数据库:

  db.createIndex({
    index: {fields: [
      '_id',
      'members.[].name'
    ]}
  }).then(() => {
    db.find({
      'selector': {
        '_id': { '$gt': null },
        'members': {
          '$elemMatch': {
            'name': {'$eq': 'Bill'}
          }
        }
      },
      'fields': [
        'members'
      ]
    }).then((result) => {
      console.log(result)
    }).catch((err) => {
      console.log(err)
    })
  })

我从上述查询中得到的结果是整个成员数组。但当我请求“name”为“Bill”时,我只需要获取以下内容,而不是完整的数组。
{
  "name": "Bill",
  "age": 32,
}

我尝试在查询中使用字段部分,但是我无法找到应该提及的内容以获取我想要的结果。

1个回答

0

在使用find进行查询时,只能指定一组与索引无关(静态)的字段,pick 选择给定文档后才能生效。

Mango查询是一种简化语法,用于处理常见情况。当您的索引和查询结构不典型时,需要直接使用map/reduce,如文档中所示:

map/reduce API适用于过于复杂的情况

因此,对第一个map/reduce示例的更改应该类似于:

function mapFun(doc) {
    if (doc.members)
      doc.members.forEach( function(m) {
        emit(m.name, m);  // key is name, value is the individual member Object
      });
  }.toString()
  ...
  return db.query('index', {
    key: 'Bill',
    include_docs: false
  });

要获得如下输出:

 {
  "offset" : 0,
  "rows": [{
    "id": "somedoc",
    "key": "Bill",
    "value": {name:'Bill', age:32}
  }],
  "total_rows" : 1
}

你能否检查一下这个例子:https://nolanlawson.github.io/pouchdb-find/,然后选择“选择特定字段”,并将`selector: {debut: {$gt: null}}替换为selector: {debut: {$eq: 1990}}`。这就是我想要的,如果可以用Mango查询实现,那么如何像示例中所示设计数据库呢?如果不行,我会按照你建议的使用Map/Reduce查询。谢谢。 - Vijay Rajasekaran
1
@VijayRajasekaran 在那个例子中,由于每个项都是自己的文档,因此使用索引进行查询,然后仅查看每个返回的文档选取字段之间的连接缺失对于查找所有项的操作也没有问题。如果您想要在不将文档分解或在每个返回的文档上再次重复过滤器的情况下执行所需的操作,则需要一个索引,每个文档具有0到多个键,其中一个文档的多个键各自映射到文档的不同部分。我不认为您会在find的源代码中看到类似的内容,也无法通过createIndex获得正确的基元访问权限。 - lossleader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接