我在 CouchDB (v. 2.1.1) 中有如下文件:
{
"xyz": "a",
"abc": "def"
},
{
"xyz": "a",
"ghi": "jkl"
},
{
"xyz": "a",
"mno": "pqr"
},
{
"xyz": "a",
"stu": "vwx"
},
{
"xyz": "a",
"bcd": 1000
}
如果我运行一个简单的地图功能,例如:
function (doc) {
if (doc.xyz ){
emit(doc.xyz, doc.abc);}}
我得到:
{
"id": "4c3406a1d92942b4fb10d1314e0061a9",
"key": "a",
"value": "def"
},
{
"id": "4c3406a1d92942b4fb10d1314e006ccf",
"key": "a",
"value": null
},
{
"id": "4c3406a1d92942b4fb10d1314e00787f",
"key": "a",
"value": null
},
{
"id": "4c3406a1d92942b4fb10d1314e00871e",
"key": "a",
"value": null
},
{
"id": "4c3406a1d92942b4fb10d1314e00906a",
"key": "a",
"value": null
}
我想尝试消除“空”输出。
我正在寻找一个 CouchDB 数据库,其中包含许多包含小信息片段的小文档,而不是让每个文档包含更多信息的大文档。
我的问题是,我的文档设计是否良好,如果是这样,我如何才能得到我正在寻找的东西,而不是“空值”行。如果我的存储设计不理想,我应该考虑什么样的设计来简化输出,因为我计划有许多小的“文档”。
编辑:
在查看了可能的答案后,我决定拥有我在问题中描述的大量小文档并没有给我带来我想象的那种好处。
我无法为 map 函数找到令人满意的解决方案来获得可读的答案。
但是,我调查了 CouchDB 最近更新中可用的“Mango”查询系统,我能够使用这些查询从我提供的数据库中获得可接受的输出。
这就是我所做的:
curl -X POST http://admin:123@127.0.0.1:5984/ptn/_find -d '{"selector": {"$or": [{"abc": {"$gt": null}},{"ghi": {"$gt": null}}]},"fields": ["abc","ghi"]}' -H "Content-Type:application/json"
未缩小:
{
"selector": {
"$or": [
{
"abc": {
"$gt": null
}
},
{
"ghi": {
"$gt": null
}
}
]
},
"fields": [
"abc",
"ghi"
]
}
输出:
{"docs":[
{"abc":"def"},
{"ghi":"jkl"}
]
.....
简明扼要的回答。
可以进行排序,但必须对已排序的字段进行索引。对于较大的数据集,无论如何都建议使用索引。
参考:
http://docs.couchdb.org/en/2.1.1/api/database/find.html
由于我的问题需要一个地图功能,这可能不能被视为一个有效的答案,但对我来说这是一个答案。我在其他数据库上尝试了一点“芒果”查询系统,它似乎比我想象的更有用/更强大,尽管它没有提供总计等方法。