如何在ydn-db中检索已排序的对象列表?

时间:2013-09-27 02:42:13

标签: javascript indexeddb ydn-db

根据此处的文档http://dev.yathit.com/ydn-db/getting-started.html中的示例,“排序”下的第一个示例。

我的代码:

var schema = {
  stores: [
    {
      name: "authors",
      keyPath: "id",
      indexes: [
        { keyPath: "born" }
      ]
    }
  ]
};
var db = new ydn.db.Storage("library", schema);

db.put("authors", [{ id: "111", born: "zzz" }, { id: "555", born: "bbb" }, { id: "999", born: "aaa" }]).done(function() {
  // query with default ordering
  db.values("authors").done(function(r) {
    console.log("A list of objects as expected", r);
  });

  // query by ordered by "born" field
  db.values(new ydn.db.Cursors("authors", "born", null, false)).done(function(r) {
    console.log("This is a list of ids, not objects", r);
  });
});

将查询从默认排序更改为特定列的排序似乎会改变其从返回对象列表到仅返回id列表的行为。难道我做错了什么?如何获取对象列表?

1 个答案:

答案 0 :(得分:1)

应该是

// query by ordered by "born" field
db.values(new ydn.db.IndexValueCursors("authors", "born", null, false)).done(function(r) {
  console.log("list of objects sorted by born", r);
});

// query by ordered by "born" field
db.values("authors", "born", null, false).done(function(r) {
  console.log("list of objects sorted by born", r);
});

或只是

db.values("authors", "born").done(function(r) {
  console.log("list of objects sorted by born", r);
 });

一个好的API应该非常容易地执行这些常见查询而无需阅读文档。我会想更好的API。现在,您必须阅读迭代器的工作原理:http://dev.yathit.com/api-reference/ydn-db/iterator.html ydn.db.Cursors的参考值是主键。这就是为什么 values返回列表主键。而ydn.db.IndexValueCursors的参考值是 记录值,因此values返回对象列表。实际上,这些是IndexedDB API的工作方式。

另一点是上面两个查询具有不同的性能特征。第二种方法,直接查询比第一种方法更快,使用迭代器。这是因为,迭代器将迭代,而第二种方法将使用批量查询。 websql的性能差异很大,因为它不支持迭代。