复合索引/搜索子数组

时间:2014-07-22 20:28:42

标签: javascript indexeddb nosql

根据以下数据,我希望做一些类似“查找父对象名称为'Panel'的块1”

所以,我尝试设置这样的复合索引:

objStore.createIndex('by_name_and_block', ['Name', 'blocks.Name']);

然后像这样调用它(排序):

var index = objStore.index("by_name_and_block");

var request = index.get("Panel", "1");

// I've also tried:
// var request = index.get(["Panel","1"]);
...

但这不起作用。有没有办法在 indexeddb

中设置此复合索引

示例数据:

[
    {
        Name: "Post",
        blocks: [
            {
                Name:"1",
                Arrays:[]
            },
            {
                Name:"2",
                Arrays:[]
            },
        ]
    },
    {
        Name: "Panel",
        blocks: [
            {
                Name:"1",
                Arrays:[]
            },
            {
                Name:"2",
                Arrays:[]
            },
        ]
    },
]

2 个答案:

答案 0 :(得分:1)

您的数据无法使用当前规范进行索引。见steps for extracting key from keyPath。请注意,对象在数组键路径中不是有效键值。

在v2中,您将能够使用索引函数表达式。

目前,您必须在持久保存到数据库之前生成额外的变量,并在检索后将其删除。使用不带复合索引的multiEntry索引。

答案 1 :(得分:0)

这个脚本是你想要的吗?

var obj = [
    {
        Name: "Post",
        blocks: [
            {
                Name:"1",
                Arrays:[]
            },
            {
                Name:"2",
                Arrays:[]
            },
        ]
    },
    {
        Name: "Panel",
        blocks: [
            {
                Name:"1",
                Arrays:[]
            },
            {
                Name:"2",
                Arrays:[]
            },
        ]
    },
];

function getBlockByName(objName, index){
    for(var i = 0; i < obj.length; i++){
        if(obj[i].Name == objName)
            return obj[i].blocks[index];
    }

    return false;
}

//Index starting from 0
console.log(getBlockByName("Panel", 1));
//Will return {Name:"2", Arrays:[]} object