我有一个非常简单的 LinqToSql 列表。
var list = DB.Where(c => c.Status.Equals("active")).Select(c => c.Name);
我正在尝试将该列表导入 MongoDB。到目前为止,这是我所拥有的:
const string connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
MongoServer server = client.GetServer();
MongoDatabase database = server.GetDatabase("test");
var collection = database.GetCollection("salesppl");
collection.Insert(list);
我也尝试过 InsertBatch 和 Save,但没有成功。以下是我收到的每个错误消息: 插入批处理
BsonSerializationException: Serializer StringSerializer expected serialization options of type RepresentationSerializationOptions, not DocumentSerializationOptions.
插入
BsonSerializationException: Serializer EnumerableSerializer expected serialization options of type ArraySerializationOptions, not DocumentSerializationOptions.
保存
InvalidOperationException: Save can only be used with documents that have an Id.
注意:我认为这无关紧要,但我是通过 LinqPad 进行的。
那么,如何将这个列表保存到 MongoDb?
最佳答案
MongoDB 是一个文档数据库。 Collection 包含一组文档,其中文档是一组键值对。简单字符串不是有效的文档(见 BSON specification)。它甚至不是有效的 BSON 元素,因为它没有 key 。它只是一个没有键的值。这就是您尝试保存字符串失败的原因。这就是为什么创建包含单个元素的有效文档(将您的字符串作为值)解决了您的问题。
以下是有关您的异常(exception)情况的详细说明。 Mongo如何插入文档?
- 获取文档类型
- 它会搜索这种类型的序列化程序
- 它将文档序列化为二进制数据
- 它将二进制数据发送到数据库
那么,让我们看看插入字符串时会发生什么。第一种情况是当您尝试插入字符串列表而不是文档列表时:
collection.InsertBatch(list);
理论上字符串也可以被认为是文档。它具有 Length
属性,可以序列化为 { Length: 42 }
文档。但是你看到了异常:
BsonSerializationException: Serializer StringSerializer expected serialization options of type RepresentationSerializationOptions, not DocumentSerializationOptions.
字符串是 BSON 元素值类型之一。因此,为字符串值序列化定义了 StringSerializer
。当 Mongo 尝试序列化您正在插入的文档时,它会搜索文档类型序列化程序。并找到 StringSerializer
。但是这个序列化器应该用于字符串元素序列化,而不是文档,你会看到异常。
下一个案例是将字符串列表作为单个文档插入:
collection.Insert(list);
本例中传递的文档类型为IEnumerable
,同时也存在相应的序列化器,用于序列化数组类型的元素。您再次看到有关错误串行器用法的异常:
BsonSerializationException: Serializer EnumerableSerializer expected serialization options of type ArraySerializationOptions, not DocumentSerializationOptions.
最后一个错误很简单
collection.Save(list);
此方法只能用于具有 Id 字段的文档。在插入或更新文档之前,Mongo 会尝试获取 Id 值。但是字符串和字符串列表都没有 Id。您会看到“未找到 IdGenerator”异常。
关于c# - 将 Linq-To-SQL 列表导入 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20296741/