C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

2019-12-30 19:21:18王旭


  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() 返回的数据格式是这样的:

mongodb,runcommand,结果集映射,command

这里用了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;
   }
  }

现在运行程序看看吧:

mongodb,runcommand,结果集映射,command