2016-05-18 1 views
0

Все документы в коллекции имеют обязательный набор общих полей вместе с другими настраиваемыми полями, которые могут различаться в каждом документе.Сценарий оболочки MongoDB для поиска во всех полях, кроме набора полей

Пример Документ 1:

{ 
    id="", 
    Name:"", 
    Description:"", 
    Doc1Field1="", 
    Doc1Field2:"", 
    Doc1Field3:"" 
    } 

Пример Документ 2:

{ 
    id="", 
    Name:"", 
    Description:"", 
    Doc2Field1="", 
    Doc2Field2:"", 
    Doc2Field3:"", 
    Doc2Field4:"" 
    } 

Как вы можете заметить doc1 и doc2 есть набор полей общего и остальных различны, и оба документы находятся в одной коллекции.

Теперь мне нужно написать сценарий оболочки, который может искать текст во всех полях, отличных от общих полей.

Я бы хотел перечислить общие поля, не хочу сравнивать. Другими словами, поиск текста во всех полях в коллекциях, кроме набора полей

Я пробовал использовать индексацию текстового поиска, но не работал.

db.MyCollection.createIndex({'$**': 'text'}, {name: 'FullTextIndex'}) 

db.MyCollection.find({$text: {$search: 'myWord'}}).count() 

отвечал на этот вопрос здесь MongoDB full text search

ответ

0

Это, как я в конечном итоге найти решение. Получить список общих полей, затем для каждого проекта исключить эти общие поля и составить список других полей. используя этот список, постройте запрос.

public virtual Dictionary<int, List<string>> GetOtherFields() 
     { 
      List<OtherField> otherFields = new List<OtherField>(); 
      List<Project> projects; 
      using (myEntities context = new myEntities()) 
      { 
       projects = context.Projects.ToList(); 
      } 
      var commonFields = GetCommonFields(); 
      foreach (var project in projects) 
      { 
       var otherFieldsOfAProject = GetOtherFieldsByProjectId(project.Id, defaultFields); 
       if (otherFieldsOfAProject.Count > 0) 
        otherFields.AddRange(otherFieldsOfAProject); 
      } 


      return OtherFieldsToDictionary(otherFields); 
     } 


public virtual List<OtherField> GetOtherFieldsByProjectId(int projectId, List<string> commonFields = null) 
     { 
      if (commonFields == null) 
       commonFields = GetCommonFields(); 
      Assembly assembly = Assembly.Load("NameSpace"); 
      var myType = assembly.GetType($"NameSpace.Imp{projectId}", false); 
      if (myType != null) 
      { 
       var properties = myType.GetProperties().ToList(); 

       var otherFieldsOfAProject = properties.Where(
        property => 
         !commonFields.Any(
          x => property.Name.Equals(x, StringComparison.InvariantCultureIgnoreCase)) 
         && property.PropertyType.Name == typeof(string).Name) 
        .Select(x => new OtherField { ProjectId = projectId, FieldName = x.Name }).ToList(); 

       return otherFieldsOfAProject; 
      } 
      return new List<OtherField>(); 
     } 


private static Dictionary<int, List<string>> OtherFieldsToDictionary(List<OtherField> otherFields) 
     { 
      var queryDictionary = otherFields.GroupBy(x => x.ProjectId) 
       .ToDictionary(g => g.Key, g => g.Select(y => y.FieldName).ToList()); 
      return queryDictionary; 
     }