var findCommand = BsonDocument.Parse("{"find":"test", limit:2, sort:{AddTime:-1}}");
var findResult = database.RunCommand<BsonDocument>(findCommand)
.GetElement("cursor").Value.ToBsonDocument()
.GetElement("firstBatch").ToBsonDocument()
.ToBson();
var personList = DeserializeBson<PersonList>(findResult);
数组不能是Bson的根元素,所以这里定义了一个PersonList类:
private class PersonList
{
public string Name { get; set; }
[JsonProperty(PropertyName = "Value")]
public PersonInfo[] List { get; set; }
}
需要注意的是上边代码中 GetElement(“firstBatch”).ToBsonDocument() 返回的数据格式是这样的:

这里用了JsonProperty将Value映射为List。
还有Person类中的属性名称和document中的也有不同,也需要映射:
private class PersonInfo
{
[JsonProperty(PropertyName = "_id")]
[JsonConverter(typeof(ObjectIdConverter))]
public string Id { get; set; }
public string Name { get; set; }
public DateTime AddTime { get; set; }
}
这里还用了一个 JsonConverter(typeof(ObjectIdConverter)) ,因为ObjectId不能直接转换为string,所以定义了一个ObjectIdConverter类:
public class ObjectIdConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(ObjectId);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value != null)
{
var value = (byte[])reader.Value;
var result = BitConverter.ToString(value).Replace("-", string.Empty).ToLowerInvariant();
return result;
}
return string.Empty;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
还有一个重要的方法,反序列化:
public static T DeserializeBson<T>(byte[] data)
{
MemoryStream ms = new MemoryStream(data);
using (BsonDataReader reader = new BsonDataReader(ms, false, DateTimeKind.Local))
{
JsonSerializer serializer = new JsonSerializer();
T e = serializer.Deserialize<T>(reader);
return e;
}
}
现在运行程序看看吧:










