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

Vij*_*ran 6 pouchdb

CouchDB文件:

  "members": [
    {
      "name": "Mark",
      "age": 35,
    },
    {
      "name": "Bill",
      "age": 32,
    }
  ]
Run Code Online (Sandbox Code Playgroud)

使用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)
    })
  })
Run Code Online (Sandbox Code Playgroud)

我从上面的查询得到的结果是整个Members数组.但是当我要求"名称"作为"比尔"而不是完整的数组时,我只需要得到以下内容.

{
  "name": "Bill",
  "age": 32,
}
Run Code Online (Sandbox Code Playgroud)

我确实尝试了查询中的字段部分,但我无法找到应该提到的内容以获得我想要的内容.

los*_*der 0

只有在选择器选择给定文档后,才可以在文档中指定一组独立于索引的(静态)字段,以便 find 进行选择

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

Map/Reduce API 是为 Mango 查询过于复杂的情况而设计的

因此,您对第一个映射/归约示例的更改将类似于:

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
  });
Run Code Online (Sandbox Code Playgroud)

要获得如下输出:

 {
  "offset" : 0,
  "rows": [{
    "id": "somedoc",
    "key": "Bill",
    "value": {name:'Bill', age:32}
  }],
  "total_rows" : 1
}
Run Code Online (Sandbox Code Playgroud)