2011-09-11 38 views
2

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

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

一个需要被存储和查询的目的之一是如下:

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

此目的应存储与一些的ID或者指定,或者自动生成的(如果null给出),和一个集合(必须始终指定),然后我需要能够根据集合,网络和单个名称来查询它。例如,我有代码query('users', '{"network":"some_network","names":"name1"}'),我需要该代码来返回此对象(以及任何与之匹配的其他对象)。另外,我可以更改数据库,但是数据库需要能够运行进程内(自托管),并且能够在没有安装的情况下在没有管理权限的情况下运行(换句话说,无法像wcf那样绑定到主机名/ IP)。

我该如何做到这样?

+0

你基本上运行此查询:session.Query ()。凡(X => x.network == “some_network” && x.names.Any (y => y ==“name1”))。我不确定你在做什么,但是如果你使用RavenDB附带的工具,你应该没问题。 – synhershko

+0

是的,但问题是我在编译时不知道对象图。如前所述,用户可以制作json,但无论用户喜欢,都可以制作。 – Alxandr

+0

和谁生成查询?如果再次是用户,请让他使用Linq。 RavenDB将在索引方面做其余的工作。 – synhershko

回答

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

调用查询的方法之前,我转换JSON查询对象到Lucene的查询,看起来像这样:(network:"some_network" AND names:"name1"),并使用它作为一个查询 - 数据库参数。用于存储和检索全班可以在这里找到:https://github.com/Alxandr/RunJS/blob/master/src/AddIns/Storage/StorageMbro.cs