这两行,其实就完成了一个映射的工作:把MongoDB中,Test数据库下,TestCollection数据集(就是SQL中的数据表),映射到CollectionModel这个数据类中。换句话说,就是用CollectionModel这个类,来完成对数据集TestCollection的所有操作。
保持CollectionModel为空,我们往数据库写入一行数据:
private static async Task Demo(){
CollectionModel new_item = new CollectionModel();
await _collection.InsertOneAsync(new_item);
}
执行,看一下写入的数据:
{"_id" : ObjectId("5ef1d8325327fd4340425ac9")
}
OK,我们已经写进去一条数据了。因为映射类是空的,所以写入的数据,也只有_id一行内容。
但是,为什么会有一个_id呢?
1. ID字段MongoDB数据集中存放的数据,称之为文档(Document)。每个文档在存放时,都需要有一个ID,而这个ID的名称,固定叫_id。
当我们建立映射时,如果给出_id字段,则MongoDB会采用这个ID做为这个文档的ID,如果不给出,MongoDB会自动添加一个_id字段。
例如:
public class CollectionModel{
public ObjectId _id { get; set; }
public string title { get; set; }
public string content { get; set; }
}
和
public class CollectionModel{
public string title { get; set; }
public string content { get; set; }
}
在使用上是完全一样的。唯一的区别是,如果映射类中不写_id,则MongoDB自动添加_id时,会用ObjectId作为这个字段的数据类型。
ObjectId是一个全局唯一的数据。
当然,MongoDB允许使用其它类型的数据作为ID,例如:string,int,long,GUID等,但这就需要你自己去保证这些数据不超限并且唯一。
例如,我们可以写成:
public class CollectionModel{
public long _id { get; set; }
public string title { get; set; }
public string content { get; set; }
}
我们也可以在类中修改_id名称为别的内容,但需要加一个描述属性BsonId:
public class CollectionModel{
[BsonId]
public ObjectId topic_id { get; set; }
public string title { get; set; }
public string content { get; set; }
}
这儿特别要注意:BsonId属性会告诉映射,topic_id就是这个文档数据的ID。MongoDB在保存时,会将这个topic_id转成_id保存到数据集中。
在MongoDB数据集中,ID字段的名称固定叫_id。为了代码的阅读方便,可以在类中改为别的名称,但这不会影响MongoDB中存放的ID名称。
修改Demo代码:
private static async Task Demo(){
CollectionModel new_item = new CollectionModel()
{
title = "Demo",
content = "Demo content",
};
await _collection.InsertOneAsync(new_item);
}
跑一下Demo,看看保存的结果:
{"_id" : ObjectId("5ef1e1b1bc1e18086afe3183"),
"title" : "Demo",
"content" : "Demo content"
}
2. 简单字段
就是常规的数据字段,直接写就成。
public class CollectionModel{
[BsonId]
public ObjectId topic_id { get; set; }
public string title { get; set; }
public string content { get; set; }
public int favor { get; set; }
}
保存后的数据:
{"_id" : ObjectId("5ef1e9caa9d16208de2962bb"),
"title" : "Demo",
"content" : "Demo content",
"favor" : NumberInt(100)
}
3. 一个的特殊的类型 - Decimal
说Decimal特殊,是因为MongoDB在早期,是不支持Decimal的。直到MongoDB v3.4开始,数据库才正式支持Decimal。