【问题标题】:Worklight :: JSONStore :: How to work with additional search fieldsWorklight :: JSONStore :: 如何使用其他搜索字段
【发布时间】:2015-01-11 19:53:15
【问题描述】:

我正在使用 Worklight6.2,但我遇到了一个与 JSONStores 相关的小问题。

我的应用程序中有几个可以帮助我与第三方数据库上的关系模型相关联。 为了正确使用此范例,我尝试使用多个搜索索引在我的商店中查找文档。 假设我有一家这方面的商店

var data = {GUID: 'XPTO-XPTZ-FOO', product_name= 'potatos'}

有时我想通过 GUID 访问我的对象,有时我想通过 product_name 访问它。 所以我会有一个

var searchField = {GUID: 'string'};
var additionalSearchField = {product_name: 'string'};

问题是,当我使用这个附加搜索字段时,它找不到我的土豆。我想使用 additionalSearchField 来避免 JSONStore 重新创建。

我认为我没有按照预期的方式使用额外的搜索字段,但我很难理解它的概念。

来自 IBM 文档:

其他搜索字段是已编入索引但不属于所存储 JSON 数据的键。这些字段定义了键,其值(在给定的 JSON 集合中)被索引并可用于更快地搜索。

http://www-01.ibm.com/support/knowledgecenter/SSZH4A_6.1.0/com.ibm.worklight.dev.doc/devref/r_jsonstore_search_fields.html

有人可以帮我了解它们的工作原理吗?

【问题讨论】:

    标签: ibm-mobilefirst jsonstore


    【解决方案1】:

    您应该使用 product_name 作为该集合初始化的一部分,因此您将有两个搜索字段 UIDproduct_name,即:

    var collections = {
        products : {
            searchFields: {UID: "string", product_name: "string"}
        }
    };
    
    
    WL.JSONStore.init(collections);
    

    然后你可以继续搜索,即:

    $("#searchByUID").on("click", function(){
        var needle = $("#search").val();
    
        var query = {
            UID: needle
        };
    
        var collectionName = 'products';
        var options = {
            exact: true,
            limit: 10 //max of 10 docs
        }; 
    
        WL.JSONStore.get(collectionName).find(query, options)
        .then(function (results) {
            // handle your results
        })
        .fail(function (errorObject) {
            // handle error
        });
    });
    

    您也可以对 product_name

    执行相同的操作
    $("#searchByProductName").on("click", function(){
        var needle = $("#search").val();
    
        var query = {
            product_name: needle
        };
    
        // ...
    });
    

    【讨论】:

    • 感谢 Yoel,但这是我们希望避免的事情,因为这是一个增量维护错误修复,并且如果可能的话,我们希望避免重新启动 JSON 存储并丢失数据。这就是我们尝试使用高级搜索字段的原因。你知道他们应该做什么以及怎么做吗?
    • @Silva 调用 init 方法不会删除现有数据。 init 方法所做的是检查集合是否存在,如果存在,则使用现有数据对其进行初始化,否则它将创建一个新集合并存储在文件系统中。
    • 实际上我们已经尝试将另一个 searchField 添加到已经初始化的集合中,当我重新加载应用程序时,它说无法初始化集合。当我删除添加的 searchField 或销毁 JSONStore 时,它​​可以工作......
    • @Akash 搜索字段不是动态的,因此当您首先创建一个集合时,您必须提前考虑,因为您无法更改现有集合的搜索字段,除非您销毁它或删除该集合,查看更多关于那stackoverflow.com/a/21606568/4114033
    • @YoelNunez 有时,由于业务限制/波动,您无法像这样提前思考。有时一天是真的,第二天就不是了。
    【解决方案2】:

    以下是用于创建键/值存储的附加搜索字段示例,例如 localStorage

    var KEY_VALUE_COLLECTION_NAME = 'keyvalue';
    
    var collections = {};
    
    //Define the 'keyvalue' collection and use additional search fields
    collections[KEY_VALUE_COLLECTION_NAME] = {
        searchFields : {},
        additionalSearchFields : { key: 'string' }
    };
    
    WL.JSONStore.init(collections);
    //I skipped the success and failure callbacks
    
    //The code bellow assumes that the 'keyvalue' collection has been initialized.
    
    var value = 'myValue';
    var key = 'myKey';
    WL.JSONStore.get(KEY_VALUE_COLLECTION_NAME).add({key: value}, {additionalSearchFields: {key: key}});
    //I skipped the success and failure callbacks
    
    //The code bellow assumes that add has finished sucesfully.
    
    WL.JSONStore.get(KEY_VALUE_COLLECTION_NAME).find({key: key}, {exact: true, limit: 1});
    //Should call the success callback with something like this: 
    //[{_id: 1, json: {value: 'myValue'}}]
    

    看看商店in the docs的内部表示。

    如果我们想象我们添加了searchField1searchField2 而不是我上面使用的空对象,它看起来像这样:

    +-----+-----------------------------+--------------+--------------+----------------------------------------+
    | _id | key (additionalSearchField) | searchField1 | searchField2 | json                                   |
    +-----+-----------------------------+--------------+--------------+----------------------------------------+
    | 1   | myKey                       | a            | b            | {searchField1: 'a', searchField2: 'b'} |
    +-----+-----------------------------+--------------+--------------+----------------------------------------+
    

    请注意,myKey 的值 key(附加搜索字段)不是存储的 JSON 对象的一部分。这就是为什么文档说:

    其他搜索字段是已编入索引但未编入索引的键 存储的 JSON 数据的一部分。

    一旦创建表,就没有简单的方法来更改表的列(即搜索字段和其他搜索字段)。这就是你遇到这个问题的原因:-2 PROVISION_TABLE_SEARCH_FIELDS_MISMATCH。要更改被索引的内容,您需要编写一些迁移代码以将数据移动到新集合或使用 removeCollectiondestroy API 删除集合。

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 2014-10-22
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 2013-02-15
      • 2013-08-13
      • 1970-01-01
      相关资源
      最近更新 更多