如何用C#控制MongoDB中的投影定义 [英] How to control the projection definition in MongoDb using C#
本文介绍了如何用C#控制MongoDB中的投影定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个这样的域类。
public class Thing
{
public Guid Id { get; set; }
public string Name { get; set; }
public Dictionary<string, string> Stuff { get; set; }
}
我正在使用以下内容从我的数据库中检索它。
return await _db.Things
.Find(x => x.Name == name)
.SingleOrDefaultAsync(token);
正如我注意到的,可能有大量不必要的数据,所以我使用了这样的投影。
ProjectionDefinition<Thing> projection = Builders<Thing>
.Projection
.Include(a => a.Id)
.Include(a => a.Name);
BsonDocument projected = await _dbContext.Things
.Find(x => x.Name == name)
.Project(projection)
.SingleOrDefaultAsync(token);
这是可行的,但自然会删除所有词典内容。我想更改投影的定义,以包括字段,但执行构成元素的过滤。假设我只想引入所述词典中以duck开头的键。尝试可能是这样的。
ProjectionDefinition<Thing> projection = Builders<Thing>
.Projection
.Include(a => a.Id)
.Include(a => a.Name)
.Include(a => a.Stuff.Where(b => b.Key.StartsWith("duck")));
这导致以下异常。
System.NotSupportdException:不支持表达式树:{文档}{配置}
考虑到我对MongoDB一无所知,我不知道我应该添加什么、删除什么还是完全忘记这个想法。我还试图使用原始类型,以便能够以这种方式过滤数据,但我得到的唯一解决方案是POST-FETCH,基本上是宣传检索到的数据。我希望将负载从数据库降低到我的服务。
Thing projected = await _dbContext.Things
.Find(x => x.Name == name)
.Project<Thing>(projection)
.SingleOrDefaultAsync(token);
这完全可行吗?如果可行,如何(或者至少是谷歌搜索什么)?
努力证明:code examples、general operations、tutorials、wrong answers等。它可能就在某个地方,但我找不到(如果找到也认不出来)。
最后,我陷入了这样的境地--上帝原谅我,我不知道我在做什么。这到底是正确的方向,还是一群疯狂的驴子会为此咬我的后背?!
ProjectionDefinition<Thing, Thing> wtf = Builders<Thing>.Projection
.Expression(a => new Thing
{
Id = a.Id,
Name = a.Name,
Stuff = a.Stuff
.Where(b => b.Key == scope)
.ToDictionary(b => scope, b => b.Value)
});
推荐答案
这是一个使用MongoDB v4.2.8的mongo
外壳查询。
考虑以下输入文档:
{
"_id" : 1,
"name" : "john",
"stuff" : {
"mycolor" : "red",
"fruit" : "apple",
"mybook" : "programming gems",
"movie" : "star wars"
}
}
目标是投影name
和stuff
字段,但stuff
仅包含以"my"
开头的字段名称。
聚合查询:
db.test.aggregate([
{
$project: {
_id: 0,
name: 1,
stuff: {
$filter: {
input: { $objectToArray: "$stuff" },
as: "stf",
cond: { $regexMatch: { input: "$$stf.k" , regex: "^my" } }
}
}
}
},
{
$addFields: { stuff: { $arrayToObject: "$stuff" } }
}
])
和,预计产量:
{
"name" : "john",
"stuff" : {
"mycolor" : "red",
"mybook" : "programming gems"
}
}
这篇关于如何用C#控制MongoDB中的投影定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文