【问题标题】:Sort results of get()get() 的排序结果
【发布时间】:2018-04-27 23:02:16
【问题描述】:

我有一个要输出的 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>

提前致谢! :)

【问题讨论】:

    标签: javascript nosql couchdb pouchdb


    【解决方案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

    【讨论】:

    • 感谢@user3405291。您提出的文档结构通常被认为比我使用的更好 - 或者只是在这种情况下?如果我想采用您的结构和命名 - 有没有办法“自动递增”_ids(帐户 004、帐户 005 等)?有什么比从每个文档中截取最后三位数字并找到最高值更好的方法?
    • @TonaldDrump 拥有多个文档是使用NoSQL 数据库的方法。这样一来,您就可以根据您喜欢的任何文档字段对文档进行排序/索引。
    • @TonaldDrump 是的,您可以自动增加文档_id。为此,您可以使用creating documents 的 PouchDB API。在您的 JavaScript 代码中,您可以根据需要修改任何文档字段。例如,您可以有类似:... db.put({ _id: id++, name: nextName, date: nextDate }) ... 在循环内递增 _id 的内容。你只需要在你的 JavaScript 代码中实现那个循环。
    • 关于你的最后一点:我的意思是稍后回来时自动递增。要增加id,我首先必须运行get 以某种方式获取当前使用的最高文档ID。还是有别的办法?
    • @TonaldDrump 我认为您想在现有文档上增加_id,如果是这种情况,您需要获取以前的_id 并增加它。请注意,要更新现有文档,您还需要获取_rev,如mentioned in documentation
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多