2015-02-09 3 views
3

Ниже приведен рабочий код для «И» Работа нескольких запросов, я могу выполнить операцию «И» для списка запросов, «Или» для списка запросов. Но есть ли способ в MongoDB, который я могу сделать «И» или «Или» динамически для списка запросов?MongoDB Создать динамический запрос

public IQueryable<SocialRecord> GetWallSocialRecordsMongoQuery(Dictionary<string, List<string>> languagesPerTerms, string[] sources, DateTime fr, DateTime to) 
     { 
      try 
      { 
       var andList = new BindingList<IMongoQuery> 
        { 
         Query.And(Query<SocialRecord>.GTE(record => record.DateCreated, fr), 
            Query<SocialRecord>.LTE(record => record.DateCreated, to), 
            Query<SocialRecord>.In(record => record.SocialType, sources)) 
        }; 

       foreach (var languagesPerTerm in languagesPerTerms) 
       { 
        var term = languagesPerTerm; 
        andList.Add(Query.Or(Query.And((Query<SocialRecord>.Where(record => record.TermMonitorIds.Contains(term.Key))), 
           Query<SocialRecord>.In(record => record.Language, term.Value)))); 
       } 
       return _collection.FindAs<SocialRecord>(Query.And(andList)).AsQueryable(); 
      } 
      catch (Exception ex) 
      { 
       Log.Error("Exception in the Method GetWallSocialRecords, in the Class MongoSocialRecordRepository", ex); 
      } 

      return null; 
     } 

Документ Структура

{ 
    "_id" : ObjectId("53a456b27f781d19f40ac76c"), 
    "DateCreated" : ISODate("2014-06-20T15:35:56.000Z"), 
    "SocialType" : "facebook", 
    "RecordId" : "1474971936_10202431655820767", 
    "UserId" : "1474971936", 
    "UserProfileUrl" : "********", 
    "UserProfilePictureUrl" : "/Downloads/v3/432bfeb8-901e-45a4-b739-1f3f48b69d61/facebook/2014-6/1946689/10492432_10202426005479512_740185019259071925_t.jpg", 
    "Description" : "******", 
    "MediaHiResUrl" : "", 
    "MediaLowResUrl" : "", 
    "MediaMedResUrl" : "", 
    "SocialCount" : NumberLong(354), 
    "SocialCountType" : "likes", 
    "Sentiment" : "", 
    "SentimentScore" : "0.0000000", 
    "IsLocalContent" : true, 
    "IsExactMatch" : true, 
    "IsHashTag" : false, 
    "IsActive" : false, 
    "MediaType" : "image", 
    "TermMonitorIds" : [ 
     "432bfeb8-901e-45a4-b739-1f3f48b69d61" 
    ], 
    "UserName" : "***", 
    "DisplayName" : "", 
    "DirectUrl" : "", 
    "IsUk" : true, 
    "IsEnglish" : true, 
    "Language" : "en", 
    "Location" : "GB", 
    "DataVersion" : "v3" 
} 

Редактировать

Мне нужно, чтобы получить ниже запроса:

query { 
    "DateCreated" : { 
     "$gte" : ISODate("2015-02-02T16:55:37.979Z"), 
     "$lte" : ISODate("2015-02-09T16:55:37.979Z") 
    }, 
    "SocialType" : { 
     "$in" : ["twitter"] 
    }, 
    "$or" : [{ 
      "TermMonitorIds" : "b34b8bea-d1e6-4d05-bd25-5d07ad0b691e", 
      "Language" : { 
       "$in" : ["zh", "eo", "ja"] 
      } 
     }, { 
      "TermMonitorIds" : "c8497f52-70dd-47b6-8abe-afac42c3a009", 
      "Language" : { 
       "$in" : ["zh", "eo", "ja"] 
      } 
     } 
    ] 
} 

будут оценены любые предложения.

+1

Что не так в этом вопросе? почему он проголосовали? –

+0

Я думаю, что ваш вопрос непонятен и ** вероятно ** его причина проголосовать – Disposer

+0

Согласен, я не могу понять, что вы просите. 'Query.And' и' Query.Or' могут принимать перечислимый список. – JohnnyHK

ответ

0

Я нашел способ сделать это, Вы можете помочь любому:

public IQueryable<SocialRecord> GetWallSocialRecordsMongoQuery(Dictionary<string, List<string>> languagesPerTerms, string[] sources, DateTime fr, DateTime to) 
     { 
      try 
      { 
       var list = new BindingList<IMongoQuery>(); 

       foreach (var languagesPerTerm in languagesPerTerms) 
       { 
        var term = languagesPerTerm; 
        list.Add(!term.Value.Contains("All") 
           ? Query.And(
            Query<SocialRecord>.Where(record => record.TermMonitorIds.Contains(term.Key)), 
            Query<SocialRecord>.In(record => record.Language, term.Value)) 
           : Query<SocialRecord>.Where(record => record.TermMonitorIds.Contains(term.Key))); 
       } 

       var query = Query.And(Query<SocialRecord>.GTE(record => record.DateCreated, fr), 
           Query<SocialRecord>.LTE(record => record.DateCreated, to), 
           Query<SocialRecord>.In(record => record.SocialType, sources), 
           Query.Or(list)); 

       //var x = _collection.FindAs<SocialRecord>(query).Explain(); 

       return _collection.FindAs<SocialRecord>(query).AsQueryable(); 
      } 
      catch (Exception ex) 
      { 
       Log.Error("Exception in the Method GetWallSocialRecords, in the Class MongoSocialRecordRepository", ex); 
      } 

      return null; 
     } 

Пожалуйста, не то, что MongoDB Запросы с $ или оператор может использовать отдельные индексы по каждому пункту из $ или выражения.