如何在C#驱动程序中使用FindOne中的SetField来操作MongoDB?

8

我使用官方的C#驱动程序来连接MongoDB,我想在FindOne查询中使用类似于Find的SetFields功能。

var query = Query.EQ("Name", name);
Users.Find(query).SetFields(Fields.Exclude("Password"));

有没有可能让FindOne返回一个实际的类,而不是mongodb游标?
2个回答

10

MongoCursorSetFields 方法。

FindOne 方法只是在 MongoCursor 上进行的包装,内部实现如下:

public virtual TDocument FindOneAs<TDocument>() {
   return FindAllAs<TDocument>().SetLimit(1).FirstOrDefault();
}

如果您想要添加排除字段功能,只需为MongoCollection添加扩展方法即可:
public static class MongodbExtentions
{
    public static T FindOne<T>(this MongoCollection collection, 
                               params string[] excludedFields)
    {
        return collection.FindAllAs<T>().SetLimit(1)
                                        .SetFields(excludedFields)
                                        .FirstOrDefault();
    }
}

并且像这样使用:

 var user = Users.FindOne<User>("Password");

谢谢。刚刚忘记了它是开源的。 - Kuroro
更改为“in”cludedFields,因为这比“ex”cludedFields更有意义。 - Shaun McCarthy

3

我不确定findOne中的排除操作。 但是,你可以使用带有limit 1 的find来取代findOne。 这将返回一个游标,当然支持对字段进行排除操作。 像这样:

var theCursor = Users.Find(query).SetFields(Fields.Exclude("Password")).SetLimit(1) ;
var myItem = null;
foreach (var item in cursor) {
    myItem = item ;
}

谢谢您的回答,我已经更新了问题以便更加通用。SetFields - Kuroro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接