返回空结果的 Pouchdb 视图

Pouchdb view returning empty result

早上好, 我目前正在使用 Couchdb 和 Pouchdb,我在 Pouchdb 端遇到一个查询问题。

我有一个包含不同文档设置的数据库,如下所示:

{
  "_id": "fd87b66087503d760fa501fa49029f94",
  "_rev": "1-e2be19d447c98d624c2c8492eaf0a3f4",
  "type": "product",
  "name": "Blanc de Morgex et de la Salle Brut Extreme 2014",
  "category": "Wine",
  "subcategory": null,
  "zone": "Italy",
  "nation": "Valle d'Aosta",
  "province": "Morgex, AO",
  "cellar": "Cave Mont Blanc",
  "price": 30,
  "structure": null,
  "year": 2014,
  "mescita": null,
  "tag": null
}

我写的查询应该 return 匹配某些过滤器的产品的可用年份。这是查询,reduce : _count:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year != null) {
        emit(doc.year , 1);
    }
}

如果我尝试使用 Postman 添加 group = true 参数,一切正常,结果类似于:

{
    "rows": [
        {
            "key": 2004,
            "value": 2
        },
        {
            "key": 2006,
            "value": 2
        },
        {
            "key": 2008,
            "value": 2
        }
    ]
}

问题是当我 运行 使用 Pouchdb 使用以下代码查看此视图​​时,其中 return 一个 JSON 具有一个空数组:

wine_db.query('wine_list/years', {reduce: '_count', key : "Bollicine", group : true, group_level: 2}).then(function(doc) {
    years_list = doc;
    console.log('getting year list');
    console.log(doc);
}).catch(function(err){
    console.log(err);
});

我尝试对函数的参数进行一些尝试,甚至将函数更改为 return 只是一个所有年份的列表,但是没有。 我找不到问题,也找不到不同的解决方案,所以我愿意接受你的每一个建议。


另一个解决方案(组结果)

根据@user3405291 建议的指示和解决方案,我终于找到了一种按年份对结果进行分组的方法。 由于 emit 函数 return 是一个复杂的键 ['CATEGORY', YEAR] 我可以使用 startkey 和 endkey 参数来查询结果只是索引的一部分 returned 保持这种方式 reduce 函数启用对结果进行分组。

最后的视图函数是:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year) {
        emit([doc.category, doc.year], doc.year );
    }
}

和 Pouchdb 查询:

wine_db.query('wine_list/years', 
    {
        startkey : ['CATEGORY'],
        endkey : ['CATEGORY', {}],
        group: true
    }
).then(function (doc) {
    years_list = doc;
    console.log(years_list);
}).catch(function (err) {
    console.log(err);
}); 

结果,其中值为具有该索引的元素总数:

{
    "rows": [
        {
            "key": [
                "Bollicine",
                2004
            ],
            "value": 2
        },
        {
            "key": [
                "Bollicine",
                2006
            ],
            "value": 2
        },
        {
            "key": [
                "Bollicine",
                2008
            ],
            "value": 2
        }
    ]
}

在您的视图地图功能中,您 emit 为 key/index:

emit(doc.year , 1);

现在,我不确定您为什么要使用 {key : "Bollicine"}:

这样的键进行查询
wine_db.query('wine_list/years', {key : "Bollicine"})
.then(res=>{console.log(res)})

当然你会得到一个空的响应,因为你的视图实际上是根据 year 索引你的文档。我认为您可能想要使用如下键进行查询:{key : "2014"}


更新

根据您的评论,我觉得您需要根据 yearcategory 查找文档。我不确定我是否理解你想要什么,但这可能会对你有所帮助:像这样更改你的视图地图功能:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year) {
        emit([doc.year, doc.category] , 1);
    }
}

以上视图将根据年份类别 为您的文档编制索引。然后,您可以这样查询您的视图:

wine_db.query('wine_list/years', {key : ['2014', 'Bollicine']})
.then(res=>{console.log(res)})

以上查询将为您提供 year 字段等于 2014category 字段等于 Bollicine.

的所有文档

第二次更新

your code works, but I just get the result for the year 2014. What I'm trying to accomplish is to get all the available years given a specific category

一个解决方案是:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year) {
        emit(doc.category, doc.year);
    }
}

以上视图将根据 category 作为键索引您的文档,并将 return year 作为值。因此你可以这样查询:

wine_db.query('wine_list/years', {key : 'Bollicine'})
.then(res=>{console.log(res)})

您应该会收到这样的回复,这样您就拥有了 Bollicine 类别的所有可用

{
    "total_rows": 400,
    "offset": 0,
    "rows": [
        {
            "key": "Bollicine",
            "value": "2014"
        },

        {
            "key": "Bollicine",
            "value": "2015"
        },

        {
            "key": "Bollicine",
            "value": "2018"
        }

    ]
}