如何解决按日期排序并在 CouchDB 视图中获取最新值
我有 ID 和时间戳不明确的文档。 例如我有类似下面的内容
Id | 时间戳 |
---|---|
a | 2021-02-22T09:11:21.961Z |
b | 2021-02-22T09:11:21.961Z |
c | 2021-02-22T09:11:21.961Z |
a | 2021-02-22T19:21:11.861Z |
c | 2021-02-22T19:21:11.861Z |
当我使用开始和结束键查询视图时,我希望结果只是最近的值,例如
Id | 时间戳 |
---|---|
a | 2021-02-22T19:21:11.861Z |
c | 2021-02-22T19:21:11.861Z |
我尝试了以下视图/地图功能
function (doc) {
DeltaTime = new Date(doc.resultTime);
DeltaTime.setMilliseconds(DeltaTime.getMilliseconds()-doc.Timestamp);
FinalDate= new Date(DeltaTime);
doc.al.forEach(e =>
emit([new Date(FinalDate.setMilliseconds(FinalDate.getMilliseconds()+e.blk)),e.id16,e.pos.x,e.pos.y],// key
{e.id16,e.pos.y}) // value
)
doc.tl.forEach(e =>
emit([new Date(FinalDate.setMilliseconds(FinalDate.getMilliseconds()+e.t)),e.pos.y}) // value
)
}
带有_design/GetDeatails/_view/AnchorandTag?startkey=[%222021-02-22T09:11:21.961Z%22]&endkey=[%222021-02-24T11:11:22.061Z%22,{}]&descending=true
它似乎不起作用。我该如何解决这个问题?
解决方法
“它似乎不起作用”是一个滑溜溜的评论。
startkey=["2021-02-22T09:11:21.961Z"]&endkey=[%222021-02-24T11:11:22.061Z%22,{}]&descending=true
应该返回一个空结果。为什么?
相关的 CouchDB documentation 有关于 descending
参数的答案,当 descending=true
与您的问题相关 - 您没有交换开始和结束键:
...结果将是空的,因为视图中的条目被颠倒了 在应用密钥过滤器之前,因此 endkey ... 将在开始键之前看到......导致空 列表。
相反,您应该反转提供给 startkey 的值并 endkey 参数以匹配应用于键的降序排序
(强调我的)
因此,当 descending=true
查询必须交换开始值和键值。
下面是一个使用 pouchDB 的演示。注意当参数没有正确交换时,pouchDB 会返回一条很好的错误消息。
我选择用这个地图功能保持简单
function (doc) {
emit(doc.Timestamp,doc.Id);
}
以便专注于实际问题,而不是复制复杂的键排列,对于这个答案,这只会妨碍。
async function showViewDocs(title,elId,view,params) {
// show title
gel(elId).innerHTML = title;
// show parameters
gel(elId + "_params").innerText = "Parameters\n" + JSON.stringify(params,undefined,2);
//show result
let text;
try {
const result = await db.query(view,params);
text = result.rows.map(row => [row.value,row.key].join('\t')).join('\n');
} catch (err) {
text = JSON.stringify(err,2);
}
gel(elId + "_result").innerText = "\nResults:\n---------------------------------\n" + text;
}
function getDocsToInstall() {
const docs = [{
"Id": "a","Timestamp": "2021-02-22T09:11:21.961Z",},{
"Id": "b",{
"Id": "c",{
"Id": "a","Timestamp": "2021-02-22T19:21:11.861Z",}
];
// design document
const ddoc = {
"_id": "_design/SO-67215994","views": {
"timestamp_id": {
"map": `function (doc) {
emit(doc.Timestamp,doc.Id)
}`
}
}
};
docs.push(ddoc);
return docs;
}
const db = new PouchDB('SO-67215994',{
adapter: 'memory'
});
// install docs and show view in various forms.
(async() => {
const viewName = 'SO-67215994/timestamp_id';
await db.bulkDocs(getDocsToInstall());
// show to raw view
let params = {
include_docs: false,reduce: false
}
await showViewDocs("Raw view",'view',viewName,params);
// descending = true; NOT swapping start/end keys (problem)
params = {
include_docs: false,reduce: false,descending: true,startkey: "2021-02-22T00:00:00.000Z",endkey: "2021-02-22T11:59:59.999Z"
}
await showViewDocs("Problem: Descending = true,start/end keys <em>NOT</em> swapped",'date_range_1',params);
//
// descending = true; swap start/end keys.
//
params = {
include_docs: false,// <-- Descending,swap start/end keys.
startkey: "2021-02-22T11:59:59.999Z",endkey: "2021-02-22T00:00:00.000Z"
}
await showViewDocs("Descending: start/end keys swapped",'date_range_2',params);
})();
const gel = id => document.getElementById(id);
.title {
margin-top: 2em;
padding: .33em;
color: black;
background: lightgray;
}
<script src="https://cdn.jsdelivr.net/npm/pouchdb@7.1.1/dist/pouchdb.min.js"></script>
<script src="https://github.com/pouchdb/pouchdb/releases/download/7.1.1/pouchdb.memory.min.js"></script>
<div id="view" class="title"></div>
<pre id="view_params"></pre>
<pre id='view_result'></pre>
<div id="date_range_1" class="title"></div>
<pre id="date_range_1_params"></pre>
<pre id='date_range_1_result'></pre>
<div id="date_range_2" class="title"></div>
<pre id="date_range_2_params"></pre>
<pre id='date_range_2_result'></pre>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。