存储和检索无类对象(json)
本文关键字:json 对象 检索 存储 | 更新日期: 2023-09-27 18:08:11
我正在编写一个应用程序,其中用户可以编写json代码并存储json代码与Id和集合。换句话说,它们指定一个Id,一个Collection (string;[a- za - z0 -9])和一个数据(json,可以是任何有效的json)。
到目前为止,我一直在使用RavenDb,因为我认为文档数据库将是完美的,但我在查询方面遇到了一些问题。
需要存储和查询的对象之一如下:
{
"network": "some_network",
"names": ["name1","name2"],
"data": {"values":[],"keys":[]}
}
这个对象应该存储一些Id指定,或自动生成(如果null
给定),和一个集合(必须始终指定),然后我需要能够查询它基于集合,网络和一个单一的名称。
例如,我有代码query('users', '{"network":"some_network","names":"name1"}')
,我需要该代码返回这个对象(以及与之匹配的任何其他对象)。
另外,我可以更改数据库,但数据库需要能够运行在进程中(自托管),并且能够在没有安装的情况下运行没有管理员权限(换句话说,它不能像wcf那样绑定到主机名/ip)。
我怎样才能做到这一点呢?
我找到了答案:
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方法之前,我将json-query-object转换为Lucene-query,看起来像这样:(network:"some_network" AND names:"name1")
,并将其用作数据库的查询参数。存储和检索的整个类可以在这里找到:https://github.com/Alxandr/RunJS/blob/master/src/AddIns/Storage/StorageMbro.cs