尝试从Mongo数据库中的所有文档中获取单个字段的列表

时间:2016-07-05 15:26:38

标签: c# mongodb

我使用的是最后一个驱动程序。我的文件格式为

{
    "ItemID": 292823,
    ....
}

第一个问题:我试图获取所有ItemID的列表,然后对它们进行排序。但是,我的搜索只是拉回所有_id,而没有任何ItemID。我做错了什么?

  var f = Builders<BsonDocument>.Filter.Empty;
  var p = Builders<BsonDocument>.Projection.Include(x => x["ItemID"]);
  var found= collection.Find(f).Project<BsonDocument>(p).ToList().ToArray();

当我尝试查询输出时,我得到以下内容。

found[0].ToJson()
"{ \"_id\" : ObjectId(\"56fc4bd9ea834d0e2c23a4f7\") }"

它缺少ItemID,只有mongo id。

解决方案:我搞砸了案子。它是itemID,而不是ItemID。我仍然在排序方面遇到麻烦。

第二个问题:我尝试将第二行更改为x [&#34; ItemID&#34;]。AsInt32,但后来出现错误的InvalidOperationException

  

从“System.Int32&#39;”类型中重写子表达式。输入   &#39; MongoDB.Bson.BsonValue&#39;是不允许的,因为它会改变   操作的意义。如果这是故意的,请覆盖   &#39; VisitUnary&#39;并将其更改为允许重写。

我希望它们为int,以便我可以为查询添加排序。我的排序如下:

    var s = Builders<BsonDocument>.Sort.Ascending(x => x);
    var found= collection.Find(f).Project<BsonDocument>(p).Sort(s).ToList().ToArray();

这是对它进行排序的正确方法吗?

1 个答案:

答案 0 :(得分:3)

找到了解决方案。

//Get all documents
var f = Builders<BsonDocument>.Filter.Empty;

//Just pull itemID
var p = Builders<BsonDocument>.Projection.Include(x => x["itemID"]);

//Sort ascending by itemID
var s = Builders<BsonDocument>.Sort.Ascending("itemID");

//Apply the builders, and then use the Select method to pull up the itemID's as ints
var found = collection.Find(f)
        .Project<BsonDocument>(p)
        .Sort(s)
        .ToList()
        .Select(x=>x["itemID"].AsInt32)
        .ToArray();