Mongodb - 使用c#驱动程序包含或排除某些元素

car*_*son 32 c# mongodb mongodb-.net-driver

我如何将此mongo查询转换为C#中的Query.EQ语句?

db.users.find({name: 'Bob'}, {'_id': 1});
Run Code Online (Sandbox Code Playgroud)

换句话说,我不希望一切都返回到C# - 只需要我需要的一个元素,即_id.与往常一样,Mongo C#驱动程序教程没有帮助.

And*_*ich 39

更新:使用新驱动程序版本(1.6+),您可以使用linq避免字段名称硬编码:

var users = usersCollection.FindAllAs<T>()
                           .SetFields(Fields<T>.Include(e => e.Id, e => e.Name));
Run Code Online (Sandbox Code Playgroud)

你可以通过SetFieldsmongodb游标的方法来做到这一点:

var users = usersCollection.FindAllAs<T>()
                 .SetFields("_id") // include only _id
                 .ToList();
Run Code Online (Sandbox Code Playgroud)

默认情况下SetFields包括指定字段.如果您需要排除某些字段,您可以使用:

var users = usersCollection.FindAllAs<T>()
                 .SetFields(Fields.Exclude("_id")) // exclude _id field
                 .ToList();
Run Code Online (Sandbox Code Playgroud)

或者你可以一起使用它们:

var users = usersCollection.FindAllAs<T>()
                 .SetFields(Fields.Exclude("_id")   // exclude _id field
                                  .Include("name")) // include name field
                 .ToList();
Run Code Online (Sandbox Code Playgroud)


i3a*_*non 29

从驱动程序的v2.0开始,有一个新的async-only API.不应再使用旧的API,因为它是新API的阻止外观,不推荐使用.

目前推荐的包含或排除某些成员的Project方法是使用IFindFluent您获得的方法Find.

您可以传递lambda表达式:

var result = await collection.Find(query).Project(hamster => hamster.Id).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

或者使用投影构建器:

var result = await collection.Find(query)
    .Project<Hamster>(Builders<Hamster>.Projection.Include(hamster => hamster.Id))
    .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

var result = await collection.Find(query)
    .Project<Hamster>(Builders<Hamster>.Projection.Exclude(hamster => hamster.FirstName).
        Exclude(hamster => hamster.LastName))
    .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

  • @YaronLevi不,`Project`**不会**只在内存中过滤.**它只是获取特定字段的API. (5认同)