簡體   English   中英

在mongodb上按對象的子集合項屬性查詢

[英]Query by object's child collection item property on mongodb

我正在存儲以下內容的集合:

{
    "_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" : ""
        }
    ]

我需要根據父屬性“名稱”或問題集合和屬性“標題”進行查詢

所以我構建了以下查詢:

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 MongoDB.Driver.dll 中發生類型為“System.NotSupportedException”的異常,但未在用戶代碼中處理:“$project 或 $group 不支持 {document}。” 在 MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateValue(Expression node) 在 MongoDB.Driver.Linq.Translators.AggregateLanguageTranslator.TranslateMapping(ProjectionMapping mapping) 在 MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateProjectValue(Expression selector) 在.Driver.Linq.Translators.QueryableTranslator.TranslateSelectMany(SelectManyExpression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateSelect(SelectExpression node) at MongoDB.Driver .Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression node) at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions) at 1.GetExecutionModel(Expression expression) at MongoDB.Driver.Linq.MongoQueryableImpl 2.ToCurs 或 (CancellationToken cancelationToken) at MongoDB.Driver.IAsyncCursorSourceExtensions.ToList[TDocument](IAsyncCursorSource`1 source, CancellationToken cancelationToken) at projectname.Services.Questions.GetQuestions(String filter) in c:\\developerment\\project\\project\\Service\\Questions .cs:line 24 at projectnameAPI.Controllers.QuestionsController.Get(String filter) in c:\\developerment\\project\\project\\Controllers\\QuestionsController.cs:line 31 at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object [] 參數)在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext()

我不知道還有什么其他方法可以使用 linq 編寫查詢。

我最終將我的查詢改寫為這個。

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

一種更清潔 - 但更原始 - 的方式。 給定以下集合模式示例:

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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM