Pouchdb视图返回空结果

时间:2018-04-03 09:27:11

标签: database nosql couchdb pouchdb

早上好, 我目前正在使用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
}

我写的查询应该返回与某些过滤器匹配的可用产品年数。这是查询,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运行此视图时,使用以下代码返回带有空数组的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);
});

我试图用函数的参数稍微玩一下,甚至更改函数只返回所有年份的列表,但是没有。 我无法找到问题,也不能找到不同的解决方案,所以我对你能提出的每一个建议持开放态度。

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

根据@ user3405291建议的指示和解决方案,我终于找到了一种按年度对结果进行分组的方法。 由于emit函数返回一个复杂的键['CATEGORY', YEAR],我可以使用startkey和endkey参数来查询返回的索引部分的结果,这样就可以通过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);
}); 

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

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

1 个答案:

答案 0 :(得分:0)

在您的查看地图功能中,您emit 作为键/索引:

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的所有文档。

第二次更新

  

你的代码有效,但我刚刚得到2014年的结果。我想要完成的是获得给定特定类别的所有可用年份

一个解决方案就是:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year) {
        emit(doc.category, doc.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"
        }

    ]
}