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

34

我该如何将这个Mongo查询语句翻译成C#中的Query.EQ语句?

db.users.find({name: 'Bob'}, {'_id': 1});
换句话说,我不想把所有内容都返回到C#中 -- 只需要我需要的一个元素,即_id。像往常一样,Mongo C# Driver教程没有帮助。
4个回答

40

更新:使用新的驱动程序版本(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();

31

从 v2.0 版本的驱动程序开始,有一个全新的仅支持异步的 API。旧的 API 应该不再使用,因为它是新 API 的阻塞门面,并且已被弃用。

目前推荐的包含或排除特定成员的方法是在从 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();

但是 Project 方法只会在内存中过滤结果。整个文档都从服务器获取,如果文档很大,这种方法就不好了。C#驱动程序中必须有其他API调用,使查询仅获取特定字段。 - Yaron Levi
6
不,Project不仅仅是在内存中进行过滤。它是一个API,可以只获取特定的字段。 - i3arnon
这个方法需要类被注册吗(如 BsonClassMap.RegisterClassMap<Hamster>...)? - MoonKnight
@Killercam,你需要能够序列化存储在MongoDB中的对象。无论你是使用BsonClassMap还是属性来实现都没有关系。 - i3arnon
这实际上是非常有帮助的信息,从文档中不容易立即理解。 - Pogrindis

4

更新:您可以使用投影和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...
            }
        }
    }

0

这里有一个简单的方法,可以仅检索您需要的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.Entities的mongodb封装库。


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