couchDB - 如何显示超过 key/value?
couchDB - how to display more than key/value?
我完全陷入了我的 RDBMS 思维方式,并且有一段时间通过有限的教程和指南来了解 noSQL
我在 cloudant 中创建了一个数据库 bookmarks
并创建了两个这样的文档:
{
"_id": "3d609bd2689639afc2520f17d8f4c883",
"_rev": "2-7227c3e1350f2d4f67f62f830b3f331e",
"title": "bing homepage",
"url ": "http://www.bing.com",
"tags": [
"search",
"public"
],
"dateadded": [
2015,
5,
6
]
}
{
"_id": "79cd702a5e23b80f09664862b5cbb918",
"_rev": "1-f4428cbc76b31ec93a2b438cb6de6bb8",
"title": "google homepage",
"url ": "http://www.google.com",
"tags": [
"search",
"private"
],
"dateadded": [
2015,
5,
7
]
}
然后我创建了一个这样的视图文档:
function (doc) {
emit(doc.title, doc.url, doc.tags);
}
我希望得到一个包含我在 map 函数中指定的三个属性的结果,但我却得到了这个:
{"total_rows":2,"offset":0,"rows":[
{"id":"3d609bd2689639afc2520f17d8f4c883","key":"bing homepage","value":null},
{"id":"79cd702a5e23b80f09664862b5cbb918","key":"google homepage","value":null}
]}
我有两个问题:
- 为什么我的值为空?我删除了
doc.tags
想法也许我只能指定一个键和值,但即使那样它仍然 returns doc.url
as value:null
- 如何让结果数组中的对象包含我在 map 函数中发出的相同属性?
1. 你的 "url -> " 后面有一个 space。删除它,它将起作用。
2. emit
仅接受 2 个参数,但您可以执行以下操作:
function(doc) {
emit(doc.title, [doc.url, doc.tags]);
}
甚至更好:
function(doc) {
emit(doc.title, {"url": doc.url, "tags": doc.tags});
}
第一个视图会给你:
{"total_rows":2,"offset":0,"rows":[
{"id":"86d091d6ac800d27a6fb388a0900113d","key":"bing homepage","value":["http://www.bing.com",["search","public"]]},
{"id":"86d091d6ac800d27a6fb388a09001692","key":"google homepage","value":["http://www.google.com",["search","private"]]}
]}
第二个:
{"total_rows":2,"offset":0,"rows":[
{"id":"86d091d6ac800d27a6fb388a0900113d","key":"bing homepage","value":{"url":"http://www.bing.com","tags":["search","public"]}},
{"id":"86d091d6ac800d27a6fb388a09001692","key":"google homepage","value":{"url":"http://www.google.com","tags":["search","private"]}}
]}
我完全陷入了我的 RDBMS 思维方式,并且有一段时间通过有限的教程和指南来了解 noSQL
我在 cloudant 中创建了一个数据库 bookmarks
并创建了两个这样的文档:
{
"_id": "3d609bd2689639afc2520f17d8f4c883",
"_rev": "2-7227c3e1350f2d4f67f62f830b3f331e",
"title": "bing homepage",
"url ": "http://www.bing.com",
"tags": [
"search",
"public"
],
"dateadded": [
2015,
5,
6
]
}
{
"_id": "79cd702a5e23b80f09664862b5cbb918",
"_rev": "1-f4428cbc76b31ec93a2b438cb6de6bb8",
"title": "google homepage",
"url ": "http://www.google.com",
"tags": [
"search",
"private"
],
"dateadded": [
2015,
5,
7
]
}
然后我创建了一个这样的视图文档:
function (doc) {
emit(doc.title, doc.url, doc.tags);
}
我希望得到一个包含我在 map 函数中指定的三个属性的结果,但我却得到了这个:
{"total_rows":2,"offset":0,"rows":[
{"id":"3d609bd2689639afc2520f17d8f4c883","key":"bing homepage","value":null},
{"id":"79cd702a5e23b80f09664862b5cbb918","key":"google homepage","value":null}
]}
我有两个问题:
- 为什么我的值为空?我删除了
doc.tags
想法也许我只能指定一个键和值,但即使那样它仍然 returnsdoc.url
asvalue:null
- 如何让结果数组中的对象包含我在 map 函数中发出的相同属性?
1. 你的 "url -> " 后面有一个 space。删除它,它将起作用。
2. emit
仅接受 2 个参数,但您可以执行以下操作:
function(doc) {
emit(doc.title, [doc.url, doc.tags]);
}
甚至更好:
function(doc) {
emit(doc.title, {"url": doc.url, "tags": doc.tags});
}
第一个视图会给你:
{"total_rows":2,"offset":0,"rows":[
{"id":"86d091d6ac800d27a6fb388a0900113d","key":"bing homepage","value":["http://www.bing.com",["search","public"]]},
{"id":"86d091d6ac800d27a6fb388a09001692","key":"google homepage","value":["http://www.google.com",["search","private"]]}
]}
第二个:
{"total_rows":2,"offset":0,"rows":[
{"id":"86d091d6ac800d27a6fb388a0900113d","key":"bing homepage","value":{"url":"http://www.bing.com","tags":["search","public"]}},
{"id":"86d091d6ac800d27a6fb388a09001692","key":"google homepage","value":{"url":"http://www.google.com","tags":["search","private"]}}
]}