Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDb将文本搜索与其他查询相结合(使用$or)_C#_Mongodb_Mongodb Query - Fatal编程技术网

C# MongoDb将文本搜索与其他查询相结合(使用$or)

C# MongoDb将文本搜索与其他查询相结合(使用$or),c#,mongodb,mongodb-query,C#,Mongodb,Mongodb Query,使用MongoC#驱动程序(1.10),我试图编写一个查询,将文本搜索与其他一些过滤器结合起来。注意:如果我将或替换为和,则执行查询 public IEnumerable<Asset> GetAssets(AssetSearch search) { var list = new List<IMongoQuery>(); if (!string.IsNullOrEmpty(search.Text)) {

使用MongoC#驱动程序(1.10),我试图编写一个查询,将文本搜索与其他一些过滤器结合起来。注意:如果我将替换为,则执行查询

    public IEnumerable<Asset> GetAssets(AssetSearch search)
    {
        var list = new List<IMongoQuery>();

        if (!string.IsNullOrEmpty(search.Text))
        {
            list.Add(Query.Or(
                Query.Text(search.Text), 
                Query<Asset>.Matches(a => a.FileName, search.Text)
            ));
        }

        if (search.FolderId.HasValue)
            list.Add(Query<Asset>.EQ(a => a.FolderId, search.FolderId.Value));

        return AssetCollection.Find(Query.And(list));
    }

我试着使用文本过滤器,但它不适合我。因此,任何人都希望通过单个查询在多个列中进行搜索。你可以试试这个

var filter = Builders<Book>.Filter.Or(
    Builders<Book>.Filter.Where(p=>p.Title.ToLower().Contains(query.ToLower())),
    Builders<Book>.Filter.Where(p => p.Publisher.ToLower().Contains(query.ToLower())),
    Builders<Book>.Filter.Where(p => p.Description.ToLower().Contains(query.ToLower()))
            );
List<Book> books = Collection.Find(filter).ToList();
var filter=Builders.filter.Or(
Builders.Filter.Where(p=>p.Title.ToLower().Contains(query.ToLower()),
Builders.Filter.Where(p=>p.Publisher.ToLower().Contains(query.ToLower()),
Builders.Filter.Where(p=>p.Description.ToLower().Contains(query.ToLower()))
);
List books=Collection.Find(filter.ToList();

毫无疑问,带“AND”的BSON解释完全忽略了该条件,因为MongoDB查询中的所有查询参数都隐含着“AND”条件。问题在于,
$或
从BSON文档的顶层提取,并且除了在顶层之外,不能使用
$text
搜索操作。因此不在
{“$或”“:[{“$text”:{“$search”:“term”}]}
的隐含结构内。这与索引选择有关,与执行“文本搜索”的方式一样,“混合”是没有意义的“按与外部条件的相关性排序的输出中的结果$text search操作只能在顶层使用——我不知道这一点。所以我想我需要写两个单独的查询并合并结果?我真的很喜欢文本搜索的功能。。。但我还需要检索football.jpg这样的结果,它似乎只可能使用$match。
var filter = Builders<Book>.Filter.Or(
    Builders<Book>.Filter.Where(p=>p.Title.ToLower().Contains(query.ToLower())),
    Builders<Book>.Filter.Where(p => p.Publisher.ToLower().Contains(query.ToLower())),
    Builders<Book>.Filter.Where(p => p.Description.ToLower().Contains(query.ToLower()))
            );
List<Book> books = Collection.Find(filter).ToList();