CouchDB/Cloudant视图按数组键查询的匹配规则及时效性咨询
嘿,我来帮你拆解这两个疑问:
当前代码的过滤逻辑
你现在的代码alice.view('characters', 'soldiers', { 'keys': ['Hearts', 'Clubs'] }, ...),是分别匹配键为"Hearts"或者"Clubs"的文档——相当于把这两个字符串作为独立的过滤条件,返回所有键等于其中任意一个的结果,而不是匹配键是包含这两个元素的数组的文档。
如何实现精确匹配数组键["Hearts", "Clubs"]
要匹配键是完整数组["Hearts", "Clubs"]的文档,你需要做两个调整:
- 首先确保视图的map函数输出的键是数组类型,比如:
function(doc) { // 假设你的文档里有一个名为suits的数组字段 if (doc.suits && Array.isArray(doc.suits)) { emit(doc.suits, doc); // 直接把数组作为键emit出去 } } - 查询时把参数从
keys(复数)改成key(单数),并传入完整的数组:alice.view('characters', 'soldiers', { 'key': ['Hearts', 'Clubs'] }, function(err, body) { if (!err) { body.rows.forEach(function(doc) { console.log(doc.value); }); } });
这样就能精准命中那些键是["Hearts", "Clubs"]的文档了。
插入数据后视图能否立即更新
一般来说,这类数据库的视图不是实时主动更新的,它采用增量构建的机制:
- 当你刚插入数据就执行查询时,触发查询的同时会触发视图的增量更新,所以通常能获取到最新的数据,但如果是超大数据集或者高并发场景,可能会有极短暂的延迟。
- 如果你需要强制视图先更新再返回结果(确保绝对最新),可以在查询参数里加上
stale: false:alice.view('characters', 'soldiers', { 'key': ['Hearts', 'Clubs'], 'stale': false }, function(err, body) { // 处理结果 });
不过这个参数会增加查询的响应时间,需要根据你的业务场景权衡使用。
内容的提问来源于stack exchange,提问作者atkayla
相关产品推荐
相关产品推荐

