Ibm mobilefirst Worklight::JSONStore::如何使用其他搜索字段

Ibm mobilefirst Worklight::JSONStore::如何使用其他搜索字段,ibm-mobilefirst,jsonstore,Ibm Mobilefirst,Jsonstore,我正在使用Worklight6.2,我有一个与JSONStores相关的小问题 在我的应用程序中,我有几个例子可以帮助我在第三方数据库上建立关系模型。 为了正确使用这个范例,我尝试使用几个搜索索引来查找我的存储中的文档。 比如说,我有一家有这方面的商店 var data = {GUID: 'XPTO-XPTZ-FOO', product_name= 'potatos'} 有时我想通过GUID访问我的对象,有时我想通过产品名称访问它。 所以我会有一个 var searchField = {GUI

我正在使用Worklight6.2,我有一个与JSONStores相关的小问题

在我的应用程序中,我有几个例子可以帮助我在第三方数据库上建立关系模型。 为了正确使用这个范例,我尝试使用几个搜索索引来查找我的存储中的文档。 比如说,我有一家有这方面的商店

var data = {GUID: 'XPTO-XPTZ-FOO', product_name= 'potatos'}
有时我想通过GUID访问我的对象,有时我想通过产品名称访问它。 所以我会有一个

var searchField = {GUID: 'string'};
var additionalSearchField = {product_name: 'string'};
问题是,当我使用这个额外的搜索字段时,它找不到我的土豆。我想使用additionalSearchField来避免JSONStore的重新创建

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

来自IBM文档:

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

有人能帮我了解它们是如何工作的吗?

您应该使用产品名称作为集合初始化的一部分,这样您将有两个搜索字段UID和product\u name,即:

然后您可以继续进行搜索,即:

$("#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_名称,因此您将有两个搜索字段UID和product_name,即:

然后您可以继续进行搜索,即:

$("#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
    });
});
您也可以对产品名称执行相同的操作


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

看看商店的内部表示

如果我们想象我们添加了
searchField1
searchField2
而不是我上面使用的空对象,它会是这样的:

+-----+-----------------------------+--------------+--------------+----------------------------------------+
| _id | key (additionalSearchField) | searchField1 | searchField2 | json                                   |
+-----+-----------------------------+--------------+--------------+----------------------------------------+
| 1   | myKey                       | a            | b            | {searchField1: 'a', searchField2: 'b'} |
+-----+-----------------------------+--------------+--------------+----------------------------------------+
请注意,
myKey
键的值(附加搜索字段)不是存储的JSON对象的一部分。这就是为什么文件中说:

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


创建表后,没有简单的方法可以更改表的列(即搜索字段和其他搜索字段)。这就是为什么你会遇到这个:。要更改正在编制索引的内容,您需要编写一些迁移代码,将数据移动到新集合,或使用
removeCollection
destroy
API删除集合。

下面是一个用于创建键/值存储的附加搜索字段示例

看看商店的内部表示

如果我们想象我们添加了
searchField1
searchField2
而不是我上面使用的空对象,它会是这样的:

+-----+-----------------------------+--------------+--------------+----------------------------------------+
| _id | key (additionalSearchField) | searchField1 | searchField2 | json                                   |
+-----+-----------------------------+--------------+--------------+----------------------------------------+
| 1   | myKey                       | a            | b            | {searchField1: 'a', searchField2: 'b'} |
+-----+-----------------------------+--------------+--------------+----------------------------------------+
请注意,
myKey
键的值(附加搜索字段)不是存储的JSON对象的一部分。这就是为什么文件中说:

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


创建表后,没有简单的方法可以更改表的列(即搜索字段和其他搜索字段)。这就是为什么你会遇到这个:。要更改被索引的内容,您需要编写一些迁移代码将数据移动到新集合,或使用
removeCollection
destroy
API删除集合。

谢谢您,但这是我们希望避免的,因为这是一个增量维护错误修复,如果可能的话,我们希望避免重新初始化JSON存储并丢失数据。这就是我们尝试使用advancedSearchFields的原因。你知道他们应该怎么做吗?@Silva调用init方法不会删除现有数据。init方法所做的是检查集合是否存在,如果存在,则仅使用现有数据对其进行初始化,否则它将创建一个新集合并在文件系统中存储。实际上,我们已尝试向已初始化的集合添加另一个searchField,当我重新加载应用程序时,它会说集合无法初始化。当我删除添加的搜索字段或销毁JSONStore时,它可以工作…@Akash搜索字段不是动态的,因此当您首先创建集合时,您必须提前考虑,因为您无法更改现有集合的搜索字段,除非您销毁它或删除该集合,了解更多关于@YoelNunez的信息,有时由于业务限制/波动性,您无法像那样提前思考。有时候,一天是真的,而不是第二天。谢谢你,但这是我们希望避免的事情,因为这是一个增量维护错误修复,因此重新初始化JSON存储并丢失数据是我们希望尽可能避免的事情。这就是我们尝试使用advancedSearchFields的原因。你知道他们应该怎么做吗?@Silva调用init方法不会删除现有数据。init方法所做的是检查集合是否存在,如果存在,则仅使用现有数据对其进行初始化,否则它将创建一个新集合并在文件系统中存储。实际上,我们已尝试向已初始化的集合添加另一个searchField,当我重新加载应用程序时,它会说集合无法初始化。当我删除添加的搜索字段或销毁JSONStore时,它可以工作…@Akash搜索字段不是动态的,因此当您首先创建集合时,您必须提前考虑,因为您无法更改现有集合的搜索字段,除非您销毁它或删除该集合,了解更多关于@YoelNunez的信息,有时由于业务限制/波动性,您无法像那样提前思考。
+-----+-----------------------------+--------------+--------------+----------------------------------------+
| _id | key (additionalSearchField) | searchField1 | searchField2 | json                                   |
+-----+-----------------------------+--------------+--------------+----------------------------------------+
| 1   | myKey                       | a            | b            | {searchField1: 'a', searchField2: 'b'} |
+-----+-----------------------------+--------------+--------------+----------------------------------------+