MongoDb与查询C#驱动程序不同

时间:2014-03-23 23:51:34

标签: mongodb mongodb-.net-driver

我正在尝试使用db.collection.distinct(field, query)命令,记录here。我试图用C#驱动程序调用它,记录here

目前我正在使用代码:

_repository.Search(item.searchCriteria).Select(i => i.messageId).Distinct().ToList()

其中messageId是一个字符串,而搜索功能是:

//Create search accross all properties of type.
public IQueryable<SearchType> Search(SearchType entity)
    {
        Type entityType = entity.GetType();
        var propertiesToSearch = entityType.GetProperties(BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public);
        query = _collection.AsQueryable();
        query = query.WhereAnd(
            query.ElementType,
            propertiesToSearch.Select(p => new SearchCriteria()
                {
                    Column = p.Name,
                    Value = p.GetValue(entity),
                    Operation = WhereOperation.Equal
                }).ToArray());
        return query;
    }

所以这应该转换为:

db.collection.distinct("messageId", { $and: [ { prop1: "" }, { prop2: "" } ]  })

运行此操作时出现以下错误:

“仅对单个字段支持区别。与Distinct一起使用的投影必须解析为文档中的单个字段。”

我正在使用Mongo 2.4.9和官方C#驱动程序1.8.3

1 个答案:

答案 0 :(得分:3)

.distinct()方法是一个较旧的实现,它更像是一个包含mapReduce的便捷方法。对于涉及简单操作的更多内容,您应该使用.aggregate()

所以shell等价:

db.collection.aggregate([
    { "$match": { "$and": [ { "prop1": "" }, { "prop2": "" } ] } },
    { "$group": { "_id": "$messageId" } }  
])

这些文件只是形成了一系列BSON文件。有各种例子here