如何将Mongo LINQ查询设计为仅从文档返回子对象?

时间:2019-03-01 02:02:47

标签: c# mongodb linq parent-child

我的结构如下:

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 :(得分:0)

使用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();

        }
    }
}

生成的mongo查询:

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