首页 > 解决方案 > 如何使用 PouchDB-Find 获取特定数据(从数组中)

问题描述

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",
  "age": 32,
}

我确实尝试了查询中的字段部分,但我找不到应该提到什么来获得我想要的东西。

标签: pouchdb

解决方案


一旦您的选择器选择了给定的文档,就只能在文档中指定一组与索引无关的(静态)字段以供 find选择。

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

map/reduce API 专为 Mango 查询过于复杂的情况而设计

因此,您对第一个 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
}

推荐阅读