Не все свойства сопоставляются при запросе Azure Cosmos DB.

Я хочу интегрировать Azure CosmosDB в наш проект. Я поставил перед собой цель - создать раздел FAQ. Я создал таблицу, а также добавил к ней три коллекции с некоторыми примерами данных. Однако при запросе я вижу, что не все свойства начинают отображаться из JSON, и поэтому мой запрос не дает результата.

Мои классы моделей выглядят так;

BasisDocumentDBEntity

//This is a base class with some common shared properties
public abstract class BasisDocumentDBEntity
{
    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; }

    [JsonProperty(PropertyName = "AangemaaktDoor")]
    public string AangemaaktDoor { get; set; }

    [JsonProperty(PropertyName = "AangemaaktOp")]
    public DateTime AangemaaktOp { get; set; }

    [JsonProperty(PropertyName = "GewijzigdOp")]
    public DateTime GewijzigdOp { get; set; }

    [JsonProperty(PropertyName = "GewijzigdDoor")]
    public string GewijzigdDoor { get; set; }
}

FAQGroup

//I've came up with groups for FAQ. A group for example can be 'General' or 'Instruction video's'
public class FAQGroup : BasisDocumentDBEntity
{
    [JsonProperty(PropertyName = "Name")]
    public string Naam { get; set; }

    [JsonProperty(PropertyName = "Sections")]
    public List<FaqSection> Sections { get; set; }
}

FaqSection

//Each group can contain one or more sections. And each section can contain one or more questions.
public class FaqSection : BasisDocumentDBEntity
{
    [JsonProperty(PropertyName = "Title")]
    public string Title { get; set; }

    [JsonProperty(PropertyName = "GroupId")]
    public string GroupId { get; set; }

    public FAQGroup Group { get; set; }

    [JsonProperty(PropertyName = "Questions")]
    public List<FAQQuestion> Questions { get; set; }
}

Вопросы и ответы

//The actual question with the answer in it.
public class FAQQuestion : BasisDocumentDBEntity
{
    [JsonProperty(PropertyName = "Question")]
    public string Question { get; set; }

    [JsonProperty(PropertyName = "Answer")]
    public string Answer { get; set; }
}

Я знаю, что CosmosDB не является реляционной базой данных. Но если я правильно понимаю эту статью, она должна несколько быть возможно.

Данные моего примера хранятся таким же образом в CosmosDB;

Группа:

{
"id": "1",
"Name": "Group 1",
"Sections": [
    1,
    2,
    3
],
"AangemaaktDoor": "user",
"AangemaaktOp": "2018-07-17 08:46",
"GewijzigdDoor": "user",
"GewijzigdOp": "2018-07-17 08:46",
"_rid": "<snip>",
"_self": "<snip>",
"_etag": "<snip>",
"_attachments": "attachments/",
"_ts": 1531818056
}

Раздел:

{
"id": "1",
"GroupId": "1",
"Title": "Common",
"Questions": [
    1,
    2,
    3
],
"AangemaaktDoor": "user",
"AangemaaktOp": "2018-07-17 08:46",
"GewijzigdDoor": "user",
"GewijzigdOp": "2018-07-17 08:46",
"_rid": "<snip>",
"_self": "<snip>",
"_etag": "<snip>",
"_attachments": "attachments/",
"_ts": 1531810510
}

Вопрос:

{
"id": "1",
"Question": "My First Question is?",
"Answer": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ultrices convallis sapien, sed vestibulum nisl mollis eget. Sed feugiat aliquet orci. Sed pretium feugiat enim, nec lacinia lacus eleifend et. Morbi vitae risus cursus sapien sodales ullamcorper id ut eros. Cras semper ipsum at congue tempus. Fusce hendrerit lorem lorem, non fermentum purus vehicula vel. Nulla aliquam lorem turpis, venenatis hendrerit ligula efficitur eget. Curabitur et erat quis diam interdum vestibulum. Proin congue feugiat dui, a feugiat nisi bibendum eget. Etiam congue orci eget magna efficitur semper. Sed mattis posuere ex, ut venenatis augue condimentum ac. Etiam tincidunt est odio, vitae interdum nibh mollis a. Aliquam id hendrerit dui, et bibendum justo. In hac habitasse platea dictumst.",
"AangemaaktDoor": "user",
"AangemaaktOp": "2018-07-17 08:46",
"GewijzigdDoor": "user",
"GewijzigdOp": "2018-07-17 08:46",
"_rid": "<snip>",
"_self": "<snip>",
"_etag": "<snip>",
"_attachments": "attachments/",
"_ts": 1531810570
}

Я использую эту статью в документации Microsoft в качестве справочной информации. Но я не могу понять, почему некоторые свойства заполнены, а некоторые нет. Это то, что я получаю из своего репозитория;

введите здесь описание изображения

Поле GroupId- и Title не содержат никаких данных. И я не могу понять это. По ощущениям что-то очевидное. Есть у кого-нибудь идеи?

ОБНОВЛЕНИЕ

    public static async Task<IEnumerable<T>> GetItemsAsync(Expression<Func<T, bool>> 
predicate)
            {
            if (!_isInitialized) throw new InvalidOperationException("Repository must be initialized first!");

            //Query with filter >> returns nothing
            IDocumentQuery<T> query = _client.CreateDocumentQuery<T>(
                UriFactory.CreateDocumentCollectionUri(_databaseId, _collectionId),
                new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true })
                .Where(predicate)
                .AsDocumentQuery();

            //Query without filter >> returns list with single section but empty 'GroupId' and empty 'Title'
            var xquery = _client.CreateDocumentQuery<T>(
            UriFactory.CreateDocumentCollectionUri(_databaseId, _collectionId),
            new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true })
            .ToList();

            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                results.AddRange(await query.ExecuteNextAsync<T>());
            }

            return results;
        }

ОБНОВЛЕНИЕ 2

    public async Task<SectionDTO> GetFAQOverzicht(EFaqGroup faqGroup)
    {
        var faqSection = new SectionDTO();

        var groupId = ((int) faqGroup).ToString();
        var section = await DocumentDBRepository<FaqSection>.GetItemsAsync(faq => faq.GroupId == groupId);

        return faqSection;
    }

person Rob    schedule 17.07.2018    source источник
comment
Вы уверены, что получаете данные из правильной коллекции?   -  person SBFrancies    schedule 17.07.2018
comment
Как вы запрашиваете эти данные? Вы присоединяетесь к CosmosDB SQL? Вы делаете несколько запросов, чтобы получить объекты?   -  person Nick Chapsas    schedule 17.07.2018
comment
@NickChapsas, я скоро дополню вопрос запросом. Я понимаю, что мне нужно выполнить объединение или несколько запросов, чтобы сделать что-то. Но на данный момент проблема в том, что два обязательных поля «GroupId» и «Title» не содержат никаких данных. Хотя в моем тестовом наборе они уже заполнены.   -  person Rob    schedule 18.07.2018


Ответы (1)


CosmosDB - это не реляционная база данных, как вы уже сказали. Используемый вами CosmosDB SDK не является ORM. Это просто оболочка API CosmosDB.

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

Тот факт, что у вас есть свойство GroupId, в котором есть номер, не означает, что коллекция Section имеет какие-либо отношения с коллекцией Group. Это не Entity Framework. Для CosmosDB и SDK это всего лишь две отдельные коллекции, не имеющие между собой отношений.

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

person Nick Chapsas    schedule 17.07.2018
comment
Я понимаю это, и это имеет смысл. Но сейчас моя проблема в том, что поля, которые я хочу использовать для присоединения, не содержат никаких данных. Поля GroupId и Title пусты, и я не понимаю почему. - person Rob; 18.07.2018
comment
Вы можете показать мне вызов метода GetItemsAsync. Я подозреваю, что вы запрашиваете объект Question или Group, который является единственным без этих двух свойств - person Nick Chapsas; 18.07.2018
comment
Я снова обновил вопрос кодом. Я понимаю вашу точку зрения, но сейчас я запрашиваю Раздел. - person Rob; 18.07.2018
comment
Но как вы ограничиваете свои результаты для Раздела? Этот репозиторий обращается к коллекции, содержащей только Section объектов, потому что мне кажется, что это не так. - person Nick Chapsas; 18.07.2018
comment
репозиторий принимает общий параметр под названием 'T', T в этом случае является классом FAQSection, и именно так он должен ограничивать репозиторий только этим типом - person Rob; 18.07.2018
comment
@Rob Но где в коде вы это ограничиваете? Простая передача параметра T методу CreateDocumentQuery не ограничивает его этими объектами. В SDK такой логики нет. Это инструкция по отображению. Вы в основном говорите ему вернуть любой Document, который у него есть, и попытаться сопоставить его с параметром T. CosmosDB не зависит от типа, поэтому, если вы явно не укажете ему, что вы хотите, он вернет все. - person Nick Chapsas; 18.07.2018
comment
@Rob Мне действительно нужно закодировать эту функцию в ORM, которое я написал, Cosmonaut, для CosmosDB, потому что SDK его не поддерживает. - person Nick Chapsas; 18.07.2018
comment
ааа! Я думал, что добавление параметра ограничит ситуацию, но тогда это не так. Я посмотрю на ORM, о котором вы говорите. Благодарность! - person Rob; 19.07.2018
comment
Мы решили в данный момент не исследовать CosmosDB с этой целью. Поэтому я закрою этот вопрос. Спасибо всем, кто пытался помочь! - person Rob; 07.08.2018