集合中的所有文档都包含一组必需的公共字段以及其他自定义字段,这些字段在每个文档中都有所不同。
示例文档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()
发布了这个问题
答案 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;
}