我正在存储以下内容的集合:
{
"_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编写查询的其他方法。
答案 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));