对 get() 的结果进行排序

Sort results of get()

我有一个要输出的 CouchDB 文档 "date":

{
  "_id": "accounts",
  "accounts": [
    {
      "name": "_name.1",
      "date": 1524336565172
    },
    {
      "name": "_name.2",
      "date": 1524336565173
    },
    {
      "name": "_name.3",
      "date": 1524336565171
    }
}

现在我正在使用以下 PouchDB,它填充了 <ul>,但显然顺序不正确:

localDB.get('accounts').then(function(result){
  $.each(result.accounts, function(i, value) {
    $('ul').append('<li data-date="' + value.date + '">' + value.name + '</li>');
  });
});

我正在寻找的输出是:

<li data-date="1524336565171">_name.3</li>
<li data-date="1524336565172">_name.1</li>
<li data-date="1524336565173">_name.2</li>

提前致谢! :)

如果您有多个文档并且您打算根据文档字段对文档进行排序,CouchDB 索引就可以工作。您有一个 单个 文档,因此您不能使用 CouchDB 索引,您必须在代码逻辑中对字段进行排序。

拥有多个文档可能比将所有数据都保存在一个文档中更实用。

您可以像这样将单个文档分解为多个文档:

{
  "_id": "account 001",
  "name": "_name.1",
  "date": 1524336565172
}

{
  "_id": "account 002",
  "name": "_name.2",
  "date": 1524336565173
}

{
  "_id": "account 003",
  "name": "_name.3",
  "date": 1524336565171
}

然后您可以在 CouchDB 中创建一个视图函数并通过 date 字段获取文档 indexed/sorted,如下所示:

function (doc) {
  if(doc.date && doc.name){
    emit(doc.date, doc.name);
  }
}

以上视图可以用PouchDB创建。您可以使用 Map/reduce queries or you can use Mango queries.

虽然@user3405291 的回答通常被认为是更好的做法,但您也可以保留现有的文档结构并从您的单一帐户文档创建 view

function (doc) {
  if(doc.accounts) {
    doc.accounts.forEach(function(account) {
      emit(account.date, account.name);
    });
  }
}

不过,对于存储帐户,我强烈建议按照其他答案的建议为每个帐户使用一个文档。它更容易扩展,因为帐户可以 updated/deleted 独立。