在CouchDB中是否有以下操作?一种通过给定键返回唯一的、不同的值的方法?
SELECT DISTINCT field FROM table WHERE key="key1"
'key1' => 'somevalue'
'key1' => 'somevalue'
'key2' => 'anotherval'
'key2' => 'andanother'
'key2' => 'andanother'
字符串
举例来说:
http://localhost:5984/database/_design/designdoc/_view/distinctview?key=“key1”将返回['somevalue']
http://localhost:5984/database/_design/designdoc/_view/distinctview?key=“key2”将返回['anotherval','andanother']
3条答案
按热度按时间f0ofjuux1#
正如CouchDB权威指南中所建议的,您应该将希望唯一的值放在键中,然后使用
group=true
查询reduce函数。例如,假设
keyfield
是具有“key1”和“key2”的字段,valuefield
是具有值的字段,则map函数可以是:字符串
你的reduce函数可以是:
型
然后用
group=true&startkey=["key2"]&endkey=["key2",{}]
查询得到:型
jogvjijk2#
根据我在这里看到的,(如果需要,我会改变我的答案)
key1
和key2
看起来像独立的字段,所以你需要两个单独的视图。我在我的测试数据库中创建了5个简单的文档:
字符串
以下是您需要的2个视图查询:
型
从那里,你的reduce函数可以返回数组中的所有值,只需这样做:
型
但是,您特别提到了distinct值。由于JavaScript没有原生的
unique()
数组方法,并且我们不能在视图函数中使用CommonJS模块,因此我们必须为此添加自己的逻辑。我只是复制粘贴了我在Google上找到的第一个array.unique()
函数,你可以自己写一个更好的优化函数。型
您将在两个视图中使用相同的reduce函数。当你查询这些视图中的任何一个时,默认情况下它也会执行reduce。(您需要显式传递
reduce=false
以仅获取map
函数的结果。下面是使用上面的
map/reduce
查询检索的结果集:(请记住,它们是两个独立的查询)型
vsmadaxz3#
字符串
得到以下结果:
型
可以直接提取。