我在mongodb中有大型文档集,并且只想获得_id列表。 Mongodb查询是db.getCollection('Documents').find({},{_id : 0, _id: 1})
。但在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列表,不需要其他文件。文件可能有不同的结构,并且排除了所有其他文件难以制作。
哪个C#查询对应于指定的mongodb查询db.getCollection('Documents').find({},{_id : 0, _id: 1}
?
更新:不提供与服务器查询大量数据相关的解决方案,例如
this.Collection.Find(d => true).Project(d => d.Id).ToListAsync().Result;
答案 0 :(得分:3)
由于您使用C#驱动程序,我建议您使用AsQueryable
,然后使用linq。
在我看来,它更好,因为你不需要神奇的琴弦,你将从你的linq知识中受益。然后它看起来像这样
database.GetCollection<T>("collectionname").AsQueryable().Select(x => x.Id);
答案 1 :(得分:0)
Alexey是正确的,这些解决方案
var result = (await this.Collection<Foos>
.Find(_ => true)
.ToListAsync())
.Select(foo => foo.Id);
将整个文档集合通过网络,反序列化,然后将Id
映射到Linq To Objects中,这将是非常低效的。
诀窍是在使用.Project
执行查询之前,使用_id
仅返回.ToListAsync()
个键。
如果您不想使用强类型DTO反序列化,则可以将类型指定为原始BsonDocument
。
var client = new MongoClient(new MongoUrl(connstring));
var database = client.GetDatabase(databaseName);
var collection = database.GetCollection<BsonDocument>(collectionName);
var allIds = (await collection
.Find(new BsonDocument()) // OR (x => true)
.Project(new BsonDocument { { "_id", 1 } })
.ToListAsync())
.Select(x => x[0].AsString);
执行类似于以下的查询:
db.getCollection("SomeCollection").find({},{_id: 1})