【问题标题】:find and findOne in indexedDB在 indexedDB 中查找和 findOne
【发布时间】:2016-04-01 21:57:00
【问题描述】:

我了解 indexedDB 没有 findOne 或 find 函数(如 MongoDB 那样),但我想要完成的与这些函数类似。

我在 indexedDB 中有一个数据存储。我使用 stop_id 在商店上创建了一个索引。

我想在商店中查找所有带有stop_id 的文档。多个对象可能有一个 stop_id 值。

我有什么:

我有点作弊(如果有更好的方法请纠正我)

// this function is called from html via angularjs
    $scope.findOne = function(stop_id) {
        var db;
        var request = indexedDB.open("Trans");
        request.onerror = function(event) {
            alert("Couldn't connect to Database");
        };
        request.onsuccess = function(event) {
            db = event.target.result;
            var objectStore = db.transaction("times").objectStore("times");
            var index = objectStore.index("stop_id");

            var range = IDBKeyRange.only(stop_id);

            // call something here to retrieve
            // One or All documents with the ID of stop_id
            // passed in from the html
        }
    }

然后我想这样调用 html:

    <div class="medium-6 columns" ng-repeat="stops in objects | orderBy: 'stop_name'">
        <div class="card hoverable">
            <div class="content">
                <span class="title">{{stops.stop_name}}</span><small class="float-right">{{stops.stop_id}}</small>
                <!-- this function will search another object store, then retrieve all documents matching the stop_id -->
                {{ findOne(stops.stop_id)}}</p>
            </div>
        </div>
    </div> 

我正在考虑上述方法,因为 indexedDB 不支持本机连接,我希望使用本机 indexeddb 变通办法来实现在另一个数据存储中即时检索与 id 相关的额外数据。性能不是问题。两个数据存储文档都不会超过 150 项。

【问题讨论】:

    标签: javascript angularjs indexeddb


    【解决方案1】:

    使用 IDBIndex get 或 openCursor 方法。

    // for one
    var range = IDBKeyRange.only(myId);
    var getRequest = index.get(range);
    getRequest.onsuccess = function(event) {
      var result = event.target.result;
      console.log(result);
    };
    
    // for multiple ...
    var getRequest = index.openCursor(range);
    var documentsFound = [];
    getRequest.onsuccess = function(event) {
      var request = event.target;
      var cursor = request.result;
      if(!cursor) {
        console.log('no match found, or no more matches found');
        someFunction(documentsFound);
      } else {
        console.log('Found:', cursor.value);
        documentsFound.push(cursor.value);
        cursor.advance();
      }
    };
    

    如果存储中的多个对象可以具有相同的stop_id,则确保在 onupgradeneeded 处理程序中创建索引时不要使用unique:true 标志。

    【讨论】:

    • 谢谢。会试一试。是的,我没有在它们上创建 unique:true 索引
    • 没有按我的预期工作。我在控制台中得到了一堆重复的不明确的结果。从一开始,我不知道一个查询是否会产生多个对象,所以我选择了上面的多个选项。我可能做的不对。将不胜感激更多的澄清,以帮助我获得整个 indexeddb 的东西。
    • 上面迭代多条记录的部分永远不会返回相同的对象两次,但它可能会返回看起来相似的对象。它仅列出具有给定 stop_id 参数的所有对象。我展示了一个将匹配止损推入数组的示例。也许您没有在调用之间重置数组或类似的东西?
    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2021-12-04
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多