早上好, 我目前正在使用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
}
]
}
答案 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"}
更新
根据您的评论,我觉得您需要找到基于year
和category
的文档。我不确定我是否理解你想要的东西,但这可能会对你有所帮助:改变你的视图功能:
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
字段等于2014
且category
字段等于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"
}
]
}