Как получить конкретные данные (из массива) с помощью PouchDB-Find - PullRequest
0 голосов
/ 27 сентября 2018

Документ CouchDB:

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

Запрос БД из PouchDB с использованием PouchDB-Find:

  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)
    })
  })

Результат, полученный в результате вышеупомянутого запроса, представляет собой массив Members в целом.Но мне нужно получить только следующее, когда я запрашиваю «имя» как «Билл», а не полный массив.

{
  "name": "Bill",
  "age": 32,
}

Я пробовал раздел полей в запросе, но не могу найти то, что должно бытьупомянул, чтобы получить то, что я хочу.

1 Ответ

0 голосов
/ 03 октября 2018

Можно указать набор индексно-независимых (статических) полей в документе для поиска pick , как только ваш селектор выбрал данный документ.

Манговые запросы - это упрощенный синтаксис для общих случаев, и когда структура ваших индексов и запросов не является типичной, вам нужно использовать map / Reduce напрямую, как указано в документации:

API map / lower разработан для случаев, которые слишком сложны для запросов Mango

Таким образом, ваши изменения в первом примере map / Reduction будут выглядеть примерно так:

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
}
...