我的应用程序使用.net c#驱动程序访问mongodb。
我的数据结构如下:
{
"_id" : ObjectId("53d97351e37f520a342e152a"),
"Name" : "full question test 2",
"keywords" : ["personality", "extraversion", "agreeableness"],
"Questions" : [{
"type" : "likert",
"text" : "question 1",
},
{
"type" : "likert",
"text" : "question 2",
}]
}
我想要做的是只从问题数组中选择类型列。
现在是我的linq代码:
from e in collection.AsQueryable<scales>()
where e.Name == "full question test 2"
select new { e.Id, e.Name, e.Questions}
这将返回所有问题属性(类型和文本)。我只想要这种类型。我可以通过说e.Questions [0] .text,e.Questions [1] .text。
这样的话来做到这一点。但问题的数量因文件而异,所以我喜欢不需要这种手动编码的解决方案。
开放的想法!
答案 0 :(得分:1)
此处包含的标准查询方法具有可用于字段选择的“投影”形式,但是这不能执行诸如选择数组元素中的特定字段之类的操作。至少对于多个领域而言。
但是单个字段应该可以使用点符号形式来访问元素:
from e in collection.AsQueryable<scales>()
where e.Name == "full question test 2"
select new { e.Id, e.Name, e.Questions.type }
为了做更多的事情,您需要聚合框架可用的投影形式,其中“查询”和“投影”使用$match
和$project
运算符表示为BSON文档为管道。在shell形式中,它看起来像这样:
db.collection.aggregate([
{ "$match": {
"Name": "fullquestion test 2"
}},
{ "$project": {
"Name": 1,
"Questions.type": 1
}}
])
或者为C#构建BSON文档:
var match = new BsonDocument {
{ "$match",new BsonDocument {
{
"Name", "full question test 2"
}
}
}
};
var project = new BsonDocument {
{ "$project", new BsonDocument {
{ "Name", 1 },
{ "Questions.type": 1 }
}
}
};
var pipeline = new [] { match, project };
var result = collection.aggregate(pipeline);
基本上,聚合管道的$project
阶段可以做很多事情而不仅仅是选择字段。这里的额外支持允许诸如“更改”数组内文档结构的内容。
支持到Linq的聚合管道映射是一项正在进行的工作。您可以在此处监控问题:CSHARP-601