我向我的一位朋友解释了CouchDB有多棒,我实际上做得很好,直到他问我是否可以做一个汽车销售数据库。在给出了相当多的想法后,我没有回答,我认为这是不可能的。
我的困境是这样的。可以说一辆车有owner_id,制造商,年份,类型,颜色,颜色和价格。
我的第一个想法是发出所有键。但是你可能想要搜索一辆蓝色或红色或黄色的汽车,行驶在30.000到80.000英里之间并且价格范围很广。鉴于此查询,如果您不搜索颜色该怎么办?
我能想到的唯一方法就是做很多查询,并在我的数据库层代码中做一个手动暴力扩散数组。但这似乎相当过分,即使只有几千辆汽车。
那么,简而言之,这是否有可能以可行的方式做到?
答案 0 :(得分:1)
CouchDB专为可扩展性而设计,无限灵活性即席查询不具备可扩展性,因此不鼓励使用。但是, 可以使用临时视图。您可以POST
将您的视图(查询)作为/db/_temp_view
的JSON对象。
有关详情,请参阅http://wiki.apache.org/couchdb/HTTP_view_API#Temporary_Views和https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Concept。
此外,this answer可能对您有用。
答案 1 :(得分:1)
正如你所说,在CouchDB中没有很好的拼写方法,就像你在支持空间索引的关系数据库中这样做一样;这并不是说根本就没有希望。例如,您可以进行一些简单的聚类来索引满足特定属性集的汽车。
里程和价格看起来很适合这种方法。大多数查询可能会将这些值指定为单个数字
function oneDigit(value) {
var strValue = String(value);
return (Number(strValue[0]) * Math.pow(10, strValue.length - 1);
}
有了这个,我们可以建立一个视图,根据价格和里程将汽车组织成垃圾箱。
function (doc) {
emit([[oneDigit(doc.mileage), oneDigit(doc.price)], null]);
}
这是一个简单的问题,即所有拥有该功能的汽车:
for mileage in range(60000, 100000, 10000):
cars.append(db.view('cars/mileageAndPrice', startkey=[mileage, minPrice], endkey=[mileage + 10000, maxPrice]))