在mongodb上按对象的子集合项属性进行查询

时间:2017-11-06 05:53:37

标签: c# mongodb linq

我正在存储以下内容的集合:

{
    "_id" : ObjectId("59ffdb0c70a6560df428aaa3"),
    "name" : "Contact Information",
    "description" : "Basic contact information about myself",
    "questions" : [ 
        {
            "caption" : "First Name",
            "value" : ""
        }, 
        {
            "caption" : "Last Name",
            "value" : ""
        }, 
        {
            "caption" : "Email",
            "value" : ""
        }, 
        {
            "caption" : "Date of bith (mm/dd/yyyy)",
            "value" : ""
        }, 
        {
            "caption" : "Street Address",
            "value" : ""
        }, 
        {
            "caption" : "Address Line 2",
            "value" : ""
        }, 
        {
            "caption" : "State",
            "value" : ""
        }, 
        {
            "caption" : null,
            "value" : null
        }, 
        {
            "caption" : "Postal Code",
            "value" : ""
        }, 
        {
            "caption" : "Country",
            "value" : ""
        }
    ]

我需要根据父属性" name"进行查询。或通过问题收集和财产"标题"

所以我构建了以下查询:

var result =(from Query in this.CoreService.QuestionCategoriesCollection().AsQueryable()
                            from Questions in Query.questions
                            where Questions.caption.ToLower().Contains(filter.ToLower())
                            select Query).ToList();

但是,当查询运行时,我收到以下异常:

  

发生异常:CLR / System.NotSupportedException异常   类型' System.NotSupportedException'发生在MongoDB.Driver.dll中   但未在用户代码中处理:' $ project或$ group不支持   {文档}&#39。在   MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(表达式   节点)   MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateMapping(ProjectionMapping   映射)   MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateProjectValue(表达式   选择者)   MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSelectMany(SelectManyExpression   节点)   MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression   节点)   MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSelect(SelectExpression   节点)   MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression   节点)   MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(表达式   node,IBsonSerializerRegistry serializerRegistry,   ExpressionTranslationOptions translationOptions)at   MongoDB.Driver.Linq.MongoQueryProviderImpl 1.GetExecutionModel(Expression expression) at MongoDB.Driver.Linq.MongoQueryableImpl 2.ToCursor(的CancellationToken   cancelToken)   MongoDB.Driver.IAsyncCursorSourceExtensions.ToList [TDocument](IAsyncCursorSource`1   source,CancellationToken cancellationToken)at   projectname.Services.Questions.GetQuestions(String filter)in   c:\ developerment \ project \ project \ Service \ Questions.cs:第24行at   projectnameAPI.Controllers.QuestionsController.Get(String filter)in   C:\ developerment \项目\项目\ \控制器QuestionsController.cs:行   31点   Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(对象   target,Object []参数)at   Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext()

我不知道使用linq编写查询的其他方法。

2 个答案:

答案 0 :(得分:0)

我最终将我的查询重写为此。

    var result =this.CoreService.QuestionCategoriesCollection().Find(c=>c.name.ToLower().Contains(filter.ToLower())
    || c.questions.Any(q=>q.caption.ToLower().Contains(filter.ToLower())));

答案 1 :(得分:0)

更清洁-但更原始-的方式。 给定以下收集模式示例:

public class Parent
{
    public IEnumerable<Child> Children { get; set; }
}

public class Child
{
    public string Id { get; set; }
}

通过孩子ID获取父母:

var dictionary = new Dictionary<string, object>
{
    "Children.Id" : "childId"
}
var data = this.ParentCollection().Find(new MongoDB.Driver.CommandDocument(dictionary));