RavenDb存储和检索无类对象(json)

时间:2011-09-11 22:38:55

标签: c# json ravendb persistent-object-store

我正在编写一个应用程序,用户可以编写json代码并将该json代码存储为Id和Collection。换句话说,它们指定一个Id,一个Collection(字符串; [a-zA-Z0-9])和一个Data(json,可以是任何有效的json)。

直到现在我一直在使用RavenDb,因为我认为文档数据库是完美的,但我在查询时遇到了一些问题。

需要存储和查询的对象之一如下:

{
    "network": "some_network",
    "names": ["name1","name2"],
    "data": {"values":[],"keys":[]}
}

此对象应存储一些指定或自动生成的ID(如果给出null)和一个Collection(必须始终指定),然后我需要能够查询它基于Collection,网络和单一名称。

例如,我有代码query('users', '{"network":"some_network","names":"name1"}'),我需要该代码来返回此对象(以及与其匹配的任何其他对象)。

此外,我可以更改数据库,但数据库需要能够在进程中运行(自托管),并且无需安装即可在没有管理员权限的情况下运行(换句话说,它可以不像wcf那样绑定到hostname / ip。)

我怎样才能达到这样的目标?

1 个答案:

答案 0 :(得分:4)

我找到了答案:

    public string Query(string dynIndexName, string query)
    {
        using (var session = store.OpenSession())
        {
            var q = new IndexQuery();
            q.Query = query;
            var result = session.Advanced.DatabaseCommands.Query("dynamic/" + dynIndexName, q, new string[0]);
            return "[" + String.Join(",", result.Results.Select(r => r.ToString())) + "]";
        }
    }

在调用Query-method之前,我将json-query-object转换为Lucene查询,如下所示:(network:"some_network" AND names:"name1"),并将其用作数据库的查询参数。可以在此处找到用于存储和检索的整个班级:https://github.com/Alxandr/RunJS/blob/master/src/AddIns/Storage/StorageMbro.cs