このmongoクエリをC#のQuery.EQステートメントに変換するにはどうすればよいですか?
db.users.find({name: 'Bob'}, {'_id': 1});
つまり、すべてをC#に返す必要はありません-必要な要素は_idだけです。いつものように、 Mongo C#Driver tutorial は役に立ちません。
pdate:新しいドライバーバージョン(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をブロックするファサードであり、非推奨であるため、使用しないでください。
特定のメンバーを含めたり除外したりするための現在推奨されている方法は、Project
から取得するIFindFluent
でFind
メソッドを使用することです。
ラムダ式を渡すことができます:
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.Entities という名前のmongodbラッパーライブラリを使用しています。