c# - 将 Linq-To-SQL 列表导入 MongoDB

标签 c# linq mongodb linq-to-sql import

我有一个非常简单的 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/

相关文章:

c# - 根据条件从列表中删除重复项

scala - 哪个库最适合用于带有 Scala 的 MongoDB?

python - 查询特定时区的 mongodb 日期时间输出

image - 在 Mongodb 中存储图像并使用 Nodejs 为它们提供服务

c# - 比较两个字符串值

c# - 设置 C# 可选参数的默认值

c# - 用于测量单位的 wpf 字符串格式 c#

c# - 从从 Instagram API 检索到的 JSON 字符串中检索 "images"

c# - LINQ to entities - 构建 where 子句以测试多对多关系中的集合

linq - 如何使用 DocumentDb、LINQ 和 F# 返回多个属性?