web-dev-qa-db-ja.com

Mongodb-C#ドライバーで特定の要素を含めるまたは除外する

このmongoクエリをC#のQuery.EQステートメントに変換するにはどうすればよいですか?

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

つまり、すべてをC#に返す必要はありません-必要な要素は_idだけです。いつものように、 Mongo C#Driver tutorial は役に立ちません。

32
carlbenson

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();
39
Andrew Orsich

ドライバーのv2.0以降、非同期のみの新しいAPIがあります。古いAPIは新しいAPIをブロックするファサードであり、非推奨であるため、使用しないでください。

特定のメンバーを含めたり除外したりするための現在推奨されている方法は、Projectから取得するIFindFluentFindメソッドを使用することです。

ラムダ式を渡すことができます:

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();
29
i3arnon

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...
            }
        }
    }
1
clD

必要に応じて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ラッパーライブラリを使用しています。