使用c#在mongodb中的嵌套数组中选择特定字段

时间:2014-07-30 23:17:50

标签: c# mongodb mongodb-query aggregation-framework mongodb-.net-driver

我的应用程序使用.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。

这样的话来做到这一点。

但问题的数量因文件而异,所以我喜欢不需要这种手动编码的解决方案。

开放的想法!

1 个答案:

答案 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