我的结构如下:
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);
这是我不想做的事情,我正在获取完整的客户端对象,然后进行过滤...我尝试了诸如展开,项目等之类的所有工作……无济于事。
如何以最快的方式和最干净的方式获取资产。我只想获取所需的数据,所以不能选择客户端。
谢谢。
答案 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 } }])