MongoDB shell脚本,用于搜索除一组字段之外的所有字段

时间:2016-05-18 18:51:34

标签: mongodb shell

集合中的所有文档都包含一组必需的公共字段以及其他自定义字段,这些字段在每个文档中都有所不同。

示例文档1:

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

示例文档2:

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

您可以注意到 Doc1 Doc2 有一组共同的字段,其余的则不同,两个文档都在一个集合中。

现在我需要编写一个shell脚本,它可以在公共字段以外的所有字段中搜索文本。

我想列出常见字段,不想进行任何比较。换句话说,在集合中除一组字段

之外的所有字段中搜索文本

我尝试使用文字搜索索引,但没有成功。

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

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

MongoDB full text search

发布了这个问题

1 个答案:

答案 0 :(得分: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;
        }