对get()

时间:2018-04-21 20:09:53

标签: javascript nosql couchdb pouchdb

我有一个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>

提前致谢! :)

2 个答案:

答案 0 :(得分:1)

如果您有多个文档并且打算根据文档字段对文档进行排序,那么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字段索引/排序的文档,如下所示:

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

可以使用PouchDB创建上述视图。您可以使用Map/reduce queries,也可以使用 Mango queries

答案 1 :(得分:1)

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

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

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