2016-11-18 10 views
1

mongodbに大きな文書コレクションがあり、_idリストのみを取得したい。 Mongodbクエリはdb.getCollection('Documents').find({},{_id : 0, _id: 1})です。しかし、C#のクエリすべての_idをmongodbコレクションからC#ドライバで選択

IMongoCollection<T> Collection { get; set; } 

... 

List<BsonDocument> mongoResult = this.Collection.FindAsync(FilterDefinition<T>.Empty, new FindOptions<T, BsonDocument>() { Projection = "{ _id: 0, _id: 1 }" }).Result.ToList(); 

スローexeption InvalidOperationException: Duplicate element name '_id'. に私はのみ _idのリストを取得したい、他のfiledsは必要ありません。文書は異なる構造を持ち、他のすべての分野を手動で除外することは困難です。

どのC#クエリが指定されたmongodbクエリdb.getCollection('Documents').find({},{_id : 0, _id: 1}に対応していますか?

UPDATE:あなたは、私がAsQueryableを使用して、代わりにLINQを使用することをお勧めしますC#のドライバを使用しているので

this.Collection.Find(d => true).Project(d => d.Id).ToListAsync().Result; 

答えて

2

のような例えば、サーバからのデータのソリューションに関連するクエリを大量に、提供していません。 私の意見では、あなたが魔法の弦を必要とせず、あなたのlinqの知識から恩恵を受けるので、それはより良いです。それでこのようなものになるでしょう。

database.GetCollection<T>("collectionname").AsQuearyable().Select(x => x.Id); 
+0

ドキュメントには多くのデータが含まれています。 quearyableコレクションでプレーンセレクトを使用している場合、ドライバ**はすべてのドキュメント**のすべてのデータをロードします。大量の大量の文書はサーバ上で膨大な負荷となります。 – Alexey

+0

ドライバがそのように実装されていれば、それはインデックスでもあり、おそらくコレクション自体ではなくインデックスから取得するだろうと私は驚いています。パフォーマンスにベンチマークを付けましたか? – SJFJ

+0

私のベンチマークはExcecutionのクエリ時間で、私の最短時間のクエリは 'db.getCollection( 'Documents')ですfind({}、{_ id:0、_id:1}'。 "{"集計 ":"ドキュメント "、"パイプライン ":[{" $プロジェクト ":{" _id "}"} "、"カーソル ":{}}' – Alexey

関連する問題