簡體   English   中英

Pouch DB 數據未按排序順序插入

[英]Pouch DB data is not inserted in sorted order

我正在 electron 和 pouchdb 中使用小型表格。

將數據插入 db 時,直到第九個文檔它插入完美,但在第 10 個文檔上它插入到文檔的第二個 position 而不是插入到最后一個

在插入第 10 個文檔之前

{
  "total_rows": 9,
  "offset": 0,
    "rows": [
    { "id": "1", "key": "1", "value": {...} },
    { "id": "2", "key": "2", "value": {...} },   
    { "id": "3", "key": "3", "value": {...} },
    { "id": "4", "key": "4", "value": {...} }    
    { "id": "5", "key": "5", "value": {...} },
    { "id": "6", "key": "6", "value": {...} },   
    { "id": "7", "key": "7", "value": {...} },
    { "id": "8", "key": "8", "value": {...} },
    { "id": "9", "key": "9", "value": {...} }
  ]
}

插入第 10 個文檔后

{
  "total_rows": 10,
  "offset": 0,
    "rows": [
    { "id": "1", "key": "1", "value": {...} },
    { "id": "10", "key": "10", "value": {...} },
    { "id": "2", "key": "2", "value": {...} },   
    { "id": "3", "key": "3", "value": {...} },
    { "id": "4", "key": "4", "value": {...} }    
    { "id": "5", "key": "5", "value": {...} },
    { "id": "6", "key": "6", "value": {...} },   
    { "id": "7", "key": "7", "value": {...} },
    { "id": "8", "key": "8", "value": {...} },
    { "id": "9", "key": "9", "value": {...} }
  ]
}

這里附上js代碼

// form submit
const form = document.getElementById("form1");
form.addEventListener("submit", dbsubmit);

function dbsubmit(e) {
   e.preventDefault();
   //   getting values from form
   var Sno = document.getElementById("number").value
   var date = document.getElementById("date").value;
   var Time = document.getElementById("time").value;
   var Trip = document.querySelector('input[name="Trip"]:checked').value;
   var TripType = document.querySelector('input[name="Type"]:checked').value;
 
 // assigning form values to db table names
  var doc = {
    _id: Sno,
    Date: date,
    time: Time,
    trip: Trip,
    triptype: TripType,
  };

   // inserting to db
  db.put(doc, function(err, response) {
    if (err) {
      return console.log(err);
    } else {
      console.log("Document created Successfully", response);
    }
  });
}

插入到第 9 個 9th doc 時它完美地插入但是當插入第 10 個 doc 時它插入第二個 position。

該文檔應按 id 排序,並希望使用它在另一個頁面中查看。

我調試了但找不到解決方案,誰能幫我解決這個問題?

謝謝

您對文檔插入有一個錯誤的概念,無論是關於時間的插入順序很重要,這是從像 MS/SQL 這樣的 RDBMS 中可以預期的,或者認為應該根據數字值的字符串表示進行排序到隱含的數值(這將是數據庫的瘋狂猜測)。

正如此處此處此處以及 CouchDB 文檔3.2.2.5 所指定的那樣。 歸類規范

字符串的比較是使用 ICU 完成的,它實現了 Unicode 歸類算法,給出了鍵的字典排序。 如果您期望 ASCII 排序,這會產生令人驚訝的結果。

文檔不是按插入順序返回的,而是根據應用於文檔 id 的排序規則返回的,文檔 id 是strings

例如,您期望這樣的順序:

排 # ID
0 1個
1個 2個
2個 3個
3個 4個
4個 5個
5個 6個
6個 7
7 8個
8個 9
9 10

但是這不符合整理規則,這會產生

排 # ID
0 1個
1個 10
2個 2個
3個 3個
4個 4個
5個 5個
6個 6個
7 7
8個 8個
9 9

再次強調,插入順序(更不用說隱含的數值)不會影響結果的順序,這一點再怎么強調也不為過。 從 RDBMS 的角度來看,將 _all_docs 結果視為由_id上的索引排序是有幫助的,該索引根據排序規則排序(同樣,對於字符串,因為所有_id都是字符串類型)。

下面的代碼片段通過創建 100 個 ID 范圍從 1 到 100 的文檔來演示這一點。

 // generate canned test documents with doc _id's in the range 1 to 100. function getDocsToInstall() { let docs = []; for (let i = 1; i < 101; i++) { // _id must be a string type because that's the way it is, period. docs.push({ _id: i.toString() }); } return docs; } let db; // init db instance async function initDb() { db = new PouchDB('test', { adapter: 'memory' }); await db.bulkDocs(getDocsToInstall()); } initDb().then(async() => { let options = { limit: 25, include_docs: false, reduce: false }; const result = await db.allDocs(options); showResult(result); }); function gel(id) { return document.getElementById(id); } function cel(name) { return document.createElement(name); } function addColumn(tr, value) { const td = cel('td'); td.innerText = value; tr.append(td); } function addRow(row, index) { const tr = cel('tr'); [index, row.id].forEach(value => addColumn(tr, value)); gel('table').append(tr); } function showResult(result) { const table = gel('table'); result.rows.forEach((row, index) => { addRow(row, index); }); }
 th, td { padding: .5em; text-align: left; min-width: 4em; } table { border-collapse: collapse; }
 <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> <table id="table" border="1"> <tr> <th>row #</th> <th>id</th> </tr> </table>

從代碼片段中必須得到的結論是返回的前 3 個文檔是

排 # ID
0 1個
1個 10
2個 100

正如janl 在這里指出的那樣,如果您需要按照數字順序訪問文檔,那么創建視圖是一個不錯的選擇,以下代碼片段對此進行了演示。

該片段並排顯示了 _all_docs 和 my_index 視圖的結果。

 // generate canned test documents with doc _id's in the range 1 to 100. function getDocsToInstall() { let docs = []; for (let i = 1; i < 101; i++) { // _id must be a string type because that's the way it is, period. docs.push({ _id: i.toString() }); } // add a design doc/view for numerically ordered documents docs.push({ _id: '_design/my_ddoc', views: { my_index: { map: function(doc) { emit(Number(doc._id)); }.toString() } } }) return docs; } let db; // init db instance async function initDb() { db = new PouchDB('test', { adapter: 'memory' }); await db.bulkDocs(getDocsToInstall()); } initDb().then(async() => { let options = { limit: 25, include_docs: false, reduce: false }; const allDocs = await db.allDocs(options); const view = await db.query('my_ddoc/my_index'); showResult(allDocs, view); }); function gel(id) { return document.getElementById(id); } function cel(name) { return document.createElement(name); } function addColumn(tr, value) { const td = cel('td'); td.innerText = value; tr.append(td); } function addRow(index, allDocs, view) { const tr = cel('tr'); [index, allDocs.rows[index].key, view.rows[index].key].forEach(value => addColumn(tr, value)); gel('table').append(tr); } // show allDocs and view results side by side function showResult(allDocs, view) { const table = gel('table'); for (let i = 0; i < allDocs.rows.length; i++) { addRow(i, allDocs, view); }; }
 th, td { padding: .5em; text-align: left; min-width: 4em; } table { border-collapse: collapse; }
 <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> <table id="table" border="1"> <tr> <th>row #</th> <th>_all_docs key</th> <th>my_index key</th> </tr> </table>

請注意,對於 _all_docs, keyid是文檔_id 重要的是要了解 _all_docs 實際上是一個內置視圖,它解釋了為什么keyid出現在 _all_docs 結果中。

如果實際上您希望文檔根據時間排序,則向文檔添加創建時間戳並基於該時間戳構建視圖,例如,如果creationTime是表示時間點(毫秒)的 integer,則 map function 可能看起來像這樣Unix 紀元。

function(doc) {
   emit(doc.creationTime);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM