【问题标题】:RavenDb store and retrieve class-less objects (json)RavenDb 存储和检索无类对象 (json)
【发布时间】:2011-11-14 22:57:25
【问题描述】:

我正在编写一个应用程序,用户可以在其中编写 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)和一个集合(必须始终指定),然后我需要能够根据它进行查询关于集合、网络和单个名称。

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

另外,我可以更改数据库,但是数据库需要能够在进程内运行(自托管),并且能够在没有管理员权限的情况下运行而无需安装(换句话说,它可以'不要像 wcf 那样绑定到主机名/IP)。

我怎样才能实现这样的目标?

【问题讨论】:

  • 你实际上是在运行这个查询: session.Query().Where(x => x.network == "some_network" && x.names.Any(y => y = =“名称1”))。我不确定您要做什么,但如果您使用 RavenDB 附带的工具应该没问题。
  • 是的,但问题是我在编译时不了解对象图。如前所述,用户制作 json,并且可以按照自己的喜好制作。
  • 谁生成查询?如果那是用户,让他使用 Linq。 RavenDB 将在索引方面完成其余的工作。
  • 在没有编译类再次使用linq的情况下如何使用linq?
  • Raven 曾经支持将 Linq 查询作为字符串传递,但现在不支持了,抱歉。您可以使用 REST API 并根据用户输入为您构建 UI。本质上,这就是客户端 API Linq 支持所做的 - 查询只是 Lucene 语法。所以:“network:some_network AND names:name1”

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


【解决方案1】:

我找到了答案:

    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())) + "]";
        }
    }

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

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2013-03-08
    • 1970-01-01
    • 2013-10-15
    • 2020-07-13
    • 2023-03-26
    • 2011-07-22
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多