Как спроектировать запрос LINQ Mongo для возврата только дочернего объекта из документа? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть такая структура:

Client
    ClientId
    Name
    Address
    ...etc...
    Asset[]
        AssetId
        name
        Enabled

Я хочу получить весь актив на унцию как объект актива, а не получить весь клиент, а затем отфильтровать, чтобы получить актив (поскольку объект клиента mu имеет 50 свойств... некоторые большие массивы).

В итоге я получил:

    var filter = Builders<Client>.Filter.Eq("Id", clientId);

    var u = _coll.Find(filter)
                    .ToList()
                    .Where(w=> w.Id == clientId)
                    .SelectMany(ss=> ss.Asset);

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

Как я могу получить Актив максимально быстрым и чистым способом.Я хотел бы только получить данные, которые мне нужны, так что связать клиента - не вариант ..

спасибо.

1 Ответ

0 голосов
/ 24 апреля 2019

это довольно просто с MongoDAL, который является удобной оболочкой для драйвера c #.см. код ниже для моего подхода.

using System;
using System.Linq;
using MongoDAL;

namespace Example
{
    class Client : Entity
    {
        public string Name { get; set; }
        public Asset[] Assets { get; set; }
    }

    class Asset
    {
        public string Name { get; set; }
        public bool Enabled { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new DB("assets");

            var client = new Client
            {
                Name = "Marco Polo",
                Assets = new Asset[]
                 {
                     new Asset{ Name = "asset one", Enabled = true},
                     new Asset{ Name = "asset two", Enabled = true},
                     new Asset{ Name = "asset three", Enabled = true}
                 }
            };

            client.Save();

            var clientID = client.ID;

            var result = client.Collection()
                               .Where(c => c.ID == clientID)
                               .SelectMany(c => c.Assets)
                               .ToArray();

            Console.ReadKey();

        }
    }
}

сгенерированный запрос монго:

aggregate([{ 
"$match" : { "_id" : ObjectId("5cc0643744effe2fa482648e") } },
{ "$unwind" : "$Assets" },
{ "$project" : 
{ "Assets" : "$Assets", "_id" : 0 } }])
...