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

本文关键字:排除 元素 包含 使用 驱动程序 Mongodb | 更新日期: 2023-09-27 18:17:34

如何将此mongo查询转换为查询?c#中的EQ语句?

db.users.find({name: 'Bob'}, {'_id': 1});

换句话说,我不希望所有的东西都返回到c#中——只是我需要的一个元素,_id。与往常一样,Mongo c#驱动教程没有帮助。

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

Update:在新的驱动程序版本(1.6+)中,您可以使用linq来避免字段名硬编码:

var users = usersCollection.FindAllAs<T>()
                           .SetFields(Fields<T>.Include(e => e.Id, e => e.Name));

您可以通过mongodb游标的SetFields方法来实现:

var users = usersCollection.FindAllAs<T>()
                 .SetFields("_id") // include only _id
                 .ToList();

默认SetFields包含指定字段。如果需要排除某些字段,可以使用:

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

也可以同时使用:

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

从驱动程序的v2.0开始,有一个新的仅异步API。旧的API不应该再被使用,因为它是新API之上的一个阻塞facade,已经被弃用了。

当前推荐的包含或排除某些成员的方法是在从Find获得的IFindFluent上使用Project方法。

你可以传递一个lambda表达式:

var result = await collection.Find(query).Project(hamster => hamster.Id).ToListAsync();

或者使用投影生成器:

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

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

Update您可以使用投影和FindAsync,它返回一个光标,并且不像Find那样一次加载所有文档。您还可以为返回的文档设置排序顺序和数量限制。

    var findOptions = new FindOptions<BsonDocument>();
    findOptions.Projection = "{'_id': 1}";
    // Other options
    findOptions.Sort = Builders<BsonDocument>.Sort.Ascending("name");           
    findOptions.Limit = int.MaxValue;
    var collection = context.MongoDatabase.GetCollection<BsonDocument>("yourcollection");   
    using (var cursor = collection.FindSync("{name : 'Bob'}", options))
    {
        while (cursor.MoveNext())
        {
            var batch = cursor.Current;
            foreach (BsonDocument document in batch)
            {
                // do stuff...
            }
        }
    }

这里有一个简单的方法来检索您需要的id:

using MongoDB.Driver.Linq;
using MongoDB.Entities;
using System.Linq;
namespace StackOverflow
{
    public class User : Entity
    {
        public string Name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            new DB("test");
            (new User { Name = "Bob" }).Save();
            var id = DB.Collection<User>()
                       .Where(u => u.Name == "Bob")
                       .Select(u => u.ID)
                       .First();            
        }
    }
}

请注意,上面的代码使用的是mongodb封装库mongodb。实体