我正在尝试使用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
答案 0 :(得分:3)
.distinct()
方法是一个较旧的实现,它更像是一个包含mapReduce的便捷方法。对于涉及简单操作的更多内容,您应该使用.aggregate()
。
所以shell等价:
db.collection.aggregate([
{ "$match": { "$and": [ { "prop1": "" }, { "prop2": "" } ] } },
{ "$group": { "_id": "$messageId" } }
])
这些文件只是形成了一系列BSON文件。有各种例子here。