如何將此mongo查詢轉換爲C#中的Query.EQ語句?Mongodb - 使用c#驅動程序包含或排除某些元素
db.users.find({name: 'Bob'}, {'_id': 1});
換句話說,我不希望所有返回到C# - 只是我需要的一個元素,_id。一如既往,Mongo C# Driver tutorial沒有幫助。
如何將此mongo查詢轉換爲C#中的Query.EQ語句?Mongodb - 使用c#驅動程序包含或排除某些元素
db.users.find({name: 'Bob'}, {'_id': 1});
換句話說,我不希望所有返回到C# - 只是我需要的一個元素,_id。一如既往,Mongo C# Driver tutorial沒有幫助。
更新:有了新的驅動程序版本(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();
通過defaul SetFileds
包括指定的字段。如果您需要排除某些字段,你可以使用:
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();
由驅動器2.0開始有一個新的只異步API。不應該再使用舊的API,因爲它是新API的屏蔽外觀,因此不推薦使用。
目前推薦的包含或排除某些成員的方法是使用Project
方法從Find
獲得IFindFluent
。
您可以通過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();
更新你可以使用一個投影和FindAsync
which returns a cursor and doesn't load all documents at once unlike 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...
}
}
}
但是Project方法只對內存中的結果進行過濾。整個文檔正在從服務器獲取,如果文檔很大,這是不好的。在c#驅動程序中必須有一些其他API調用,使得查詢只提取特定的字段。 –
@YaronLevi不,**項目**不**只在內存中過濾。 **它是隻提取特定字段的API。 – i3arnon
這個方法是否需要該類進行註冊(即'BsonClassMap.RegisterClassMap ...')? –
MoonKnight