- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Ydn-Db-Fulltext 允许用户在 HTML5 应用程序中搜索本地联系人数据库。到目前为止,当涉及到搜索人名时,它效果很好,很智能,并且可以立即返回结果。
以下是包含联系人方法数组的联系人对象示例:
{
"source": "COMPANY",
"ownerPin": "12345",
"name": "brian wilkins",
"dateUpdated": "2014-03-18T14:41:05.217Z",
"dateAdded": "2014-03-18T14:41:05.217Z",
"isFavorite": false,
"socialId": "54321",
"id": "1",
"deleted": false,
"edited": false,
"favorite": false,
"contactMethods": [
{
"id": "4321",
"contactKey": "12321",
"contactId": "1",
"value": "brian.wilkins@geemail.com",
"kind": "email",
"ownerPin": "12345",
"isPrimary": false
},
{
"id": "5432",
"contactKey": "2",
"contactId": "1",
"kind": "phone",
"ownerPin": "12345",
"isPrimary": false
},
{
"id": "23",
"contactKey": "333",
"contactId": "1",
"value": "112345",
"kind": "extension",
"ownerPin": "12345",
"isPrimary": false
}
]
}
为了在“name”属性上创建索引,我按如下方式设置 fullTextCatalog:
fullTextCatalogs: [{
name: 'name',
lang: 'en',
sources: [
{
storeName: 'contacts',
keyPath: 'id',
weight: 1.0
}, {
storeName: 'contacts',
keyPath: 'name',
weight: 0.5
}
]
}],
stores: [
{
name: 'contacts',
keyPath: 'id',
autoIncrement: true
}
]
};
this.db = new ydn.db.Storage('thedatabase', db_schema);
我可以按姓名或 ID(键)进行搜索并获取匹配的联系人列表。内存中似乎储存的东西很少。每次搜索都会查询本地支持的indexedDB数据库。
挑战在于我还希望能够根据电子邮件地址和扩展名进行搜索,这些地址和扩展名存储在 contactMethods 数组内的 contactMethods 属性中。 “value”属性是我们存储电子邮件地址和/或扩展名的位置,具体取决于 contactMethod 类型。
我尝试添加 contactMethods 作为辅助可搜索对象存储,但这导致搜索“Brian”返回两个结果,其中包含姓名的联系人和包含电子邮件地址的 contactMethod。理想情况下,我想获取 contactId(联系人的外键)并使用它来提取实际的联系人对象,但这似乎会产生非常昂贵的开销,并抵消了这个出色的搜索工具的好处。
有没有办法索引不在父级的对象属性?我怎样才能以一种既能扩展又不会耗尽所有资源的方式来解决这个问题?
this.db.get(entry.storeName, entry.primaryKey).done(function(x) {
this.textContent += ' [Full name: ' + x.name + ']'; // this is in the contact
this.textContent += ' [email: ' + x.value + ']'; // but this is in the contactMethod
}, span);
最佳答案
Is there a way to index object properties that are not at the parent level?
keyPath
可以使用点分符号来引用深层对象属性。例如,您可以指定 contactMethods.value
来索引电子邮件,但不幸的是它不适用于数组值 - 正如本例所示。
因此,显而易见的选择是使用父子关系将 contactMethods
记录保存在单独的对象存储中。由于 ydn-db 目前不支持 schema 中的 embedded
属性,因此在加载父对象时必须加载所有子记录。
或者,IndexedDB v2可能具有由函数表达式生成的虚拟索引。您可以在索引架构中通过 generator
在 ydn-db 中使用,例如:
stores: [
{
name: 'contacts',
keyPath: 'id',
autoIncrement: true,
indexes: [{
name: '$emails',
multiEntry: true,
generator: function(record) {
return record.contactMethods.map(function(x) {return x.value};
})
}]
}
]
需要注意的一点是,加载数据时会出现生成的字段 $emails
。它可能会从记录中删除,以便与 v2 规范匹配。
我们在多个项目中大量使用这个生成器索引,所以我将修复错误。
在全文搜索中索引 id
和电子邮件地址很方便,但没有意义,因为基于语音的全文搜索将按原样对它们进行索引,而无需标准化。
关于javascript - 如何使用 ydn-db-fulltext 为数组中的子对象属性建立索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22566708/
我正在尝试创建一个简单的函数,允许我搜索特定表中的特定项目并使用 YDN-DB 返回所需的结果,到目前为止我有这个: var simpleSearch = function(table,field,s
我在尝试使用 Ydn-db 检索大量数据时遇到问题。 问题是: -我有一个很大的 JSon 文件,我想将其存储在我的应用程序中以供离线使用 -我查询文件然后使用db.put成功保存数据 -然后,如果我
我想做一些类似于 SQL 的 DELETE FROM table1 的事情。有一个 remove 函数需要一个叫做 KeyRange 的东西,但我不确定如何创建一个代表“所有键”的 KeyRange
我尝试使用多个 deferred 与 jquery $.when 但到目前为止没有运气,这是我的代码: var req = $.when(db.count('items'),db.values('it
我正在尝试验证给定 ID 的表中是否存在特定记录。例如: var id = 23; db.count('products',id).done(function(count) { if(coun
我查看了此处发布的示例:YDN-DB with multiple deferred其中包含一些非常接近我想要的代码,但不完全是。 我想知道在事务中嵌套延迟查询是否安全?例如: loadWorkOrde
我正在尝试构建一个函数,用于在传递键路径之后检索商店中的下一个元素。我的 getItem 看起来像这样。 req = smartpigsdb.get(store, keypath); req.done
是否可以在YDN-DB中找到多个值(例如sql IN关键字)? //simple scenario "SELECT * FROM categories WHERE code IN ('
按照此处文档中的示例 http://dev.yathit.com/ydn-db/getting-started.html ,“排序”下的第一个示例。 我的代码: var schema = { st
我可以成功创建一个indexeddb数据库并将数据加载到其中。我还可以从同一页面读取该数据库中的数据。然后,我尝试从网站上的另一个页面读取数据库。 db = new ydn.db.Storage('t
我使用 YDN-DB 作为我的 indexeddb 包装器;我已经阅读了用户指南和 API,但完全不知道如何通过 ID(主键 [自动递增])更新记录。 有人熟悉这个/有什么想法吗? http://de
不确定是 ydn-db 中的错误还是我做错了什么。所以数据成功地保存在 ydn-db 和 db.values 的数据库中,我可以从数据库中获取所有数据。但是,当我只想从数据库中获取一个数据输入时,它在
我使用 Ydn-Db-Fulltext 允许用户在 HTML5 应用程序中搜索本地联系人数据库。到目前为止,当涉及到搜索人名时,它效果很好,很智能,并且可以立即返回结果。 以下是包含联系人方法数组的联
我正在使用 YDN DB for IndexedDB,并且我想使用其 ID 从对象存储中删除记录。这是我的架构: var personsSchema = { name: "persons", keyP
我可以在将记录添加到存储后验证它是否存在,但是当我在另一个函数中并声明一个新变量以指向同一个数据库并存储和执行查询时,我收到以下错误消息。 Store: null not exists. 我用来检索数
我正在尝试将 YDN 与 Backbone.sync() 结合使用,但我遇到了 « fetchAll » 函数的问题。 例如,我有这个 View var UserListView = Backbone
将 IndexedDB 用于本地 html5 应用程序,特别是 YDN-DB 包装器,我经常需要使用动态获取的商店名称来查询商店。当商店不存在时,我会出现错误,并且 javascript 执行会中止。
我是一名优秀的程序员,十分优秀!