在CouchDB中搜索关键字列表

在CouchDB中搜索关键字列表,couchdb,couchdb-2.0,couchdb-mango,Couchdb,Couchdb 2.0,Couchdb Mango,我有包含关键字列表的文档。我如何进行查询,以便搜索关键字bela和fleck时只返回同时包含这两个关键字的文档: { "_id": "track/bela-fleck/big-country", "title": "Big Country", "artist": "Bela Fleck", "keywords": ["bela", "fleck", "big", "country"] } { "selector": { "keywords":

我有包含关键字列表的文档。我如何进行查询,以便搜索关键字
bela
fleck
时只返回同时包含这两个关键字的文档:

{
    "_id": "track/bela-fleck/big-country",
    "title": "Big Country",
    "artist": "Bela Fleck",
    "keywords": ["bela", "fleck", "big", "country"]
}
{
   "selector": {
      "keywords": {
         "$and": [
            {
               "$elemMatch": {
                  "$eq": "bela"
               }
            },
            {
               "$elemMatch": {
                  "$eq": "fleck"
               }
            }
         ]
      }
   }
}

类似这样的方法可能会奏效:

function map(doc) {
  // sort by each keyword
  for (var k in doc.keywords) {
    emit(doc.keywords[k], null);
  }      
}

db.query(map).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
…但我还没有测试过!此外,这还会进行完整的数据库扫描,因此为了提高效率,您应该在design doc中创建一个视图,如中所述。希望这有帮助


更新。。。还有一些可能有用的详细示例。

这可以通过Mango查询完成。首先,在
关键字
字段上创建索引:

{
   "index": {
      "fields": [
         "keywords"
      ]
   },
   "name": "keywords-index",
   "type": "json"
}
然后,使用
$elemMatch
查询以查找数组中与每个关键字匹配的项目,并使用
$and
查找与所有关键字匹配的文档:

{
    "_id": "track/bela-fleck/big-country",
    "title": "Big Country",
    "artist": "Bela Fleck",
    "keywords": ["bela", "fleck", "big", "country"]
}
{
   "selector": {
      "keywords": {
         "$and": [
            {
               "$elemMatch": {
                  "$eq": "bela"
               }
            },
            {
               "$elemMatch": {
                  "$eq": "fleck"
               }
            }
         ]
      }
   }
}

请注意,此方法用于在数组内搜索。

我认为它不适用于CouchDB 2.X,因为不支持临时视图。建议的方法是使用相同的映射功能在设计文档中定义视图。