RavenDb хранит и получает объекты без классов (json) - PullRequest
2 голосов
/ 12 сентября 2011

Я пишу приложение, в котором пользователь может написать json-код и сохранить этот json-код с идентификатором и коллекцией. Другими словами, они определяют Id, Collection (строка; [a-zA-Z0-9]) и Data (json, может быть любым, что является допустимым json).

До сих пор я использовал RavenDb для этого, потому что я думал, что база данных документов будет идеальной, но у меня были некоторые проблемы с запросами.

Один из объектов, который необходимо сохранить и запросить, является следующим:

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

Этот объект должен храниться с некоторым идентификатором, который либо указан, либо автоматически сгенерирован (если задано null), и коллекцией (всегда должен быть указан), а затем мне нужно иметь возможность запрашивать его на основе на коллекцию, сеть и одно имя.

Например, у меня есть код query('users', '{"network":"some_network","names":"name1"}'), и мне нужен этот код для возврата этого объекта (и любого другого объекта, который ему соответствует).

Кроме того, я согласен с изменением базы данных, но база данных должна быть в состоянии работать внутри процесса (самостоятельно) и иметь возможность работать без прав администратора без установки (другими словами, она может привязка к имени хоста / ip, как это делает wcf).

Как мне достичь чего-то подобного?

1 Ответ

4 голосов
/ 06 октября 2011

Я нашел ответ на этот вопрос:

    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-запрос, который выглядит следующим образом: (network:"some_network" AND names:"name1"), и использую этов качестве параметра запроса к базе данных.Весь класс для хранения и извлечения можно найти здесь: https://github.com/Alxandr/RunJS/blob/master/src/AddIns/Storage/StorageMbro.cs

...