我想知道以下哪个驱动程序最好:
mongodb-csharp driver
simple-mongodb driver
NoRM
Run Code Online (Sandbox Code Playgroud)
哪个认为最好!>
以下类应由 API 作为 Json 接收并存储在 MongoDB 中,使用 C# 驱动程序和 Web API。data 属性是非结构化的,但我可以将其限制为在这些值中可能嵌套数组的键值对。
public class Something
{
[BsonId, JsonIgnore]
public ObjectId _id { get; set; }
public IDictionary<string, object> data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
从客户端发布 json 时,Json.NET 会正确反序列化。
将类保存到 MongoDB,我在具有 c# 特定类型的数据库中得到类似的信息:
{
property1: 'one',
property2: {
_t: 'System.Collections.Generic.List`1[System.Object]'
_v:
[
{}, {}, {}, ...
]
}
}
Run Code Online (Sandbox Code Playgroud)
基于这些来源,我为 Json.NET 整合了一个 CustomCreationConverter,它将 List 嵌套到 Dictionary 的值中:
将 JsonDictionaryAttributes 应用于属性
public class Something
{
...
[JsonProperty(ItemConverterType = typeof(CustomConverter))] …Run Code Online (Sandbox Code Playgroud) 我必须更新除_id 之外的所有字段。我想避免手动更新 16 个字段...所有新字段都存储在 BsonDocument 中
谢谢你的想法
我正在使用官方的 MongoDB C# 驱动程序来查询使用驼峰式属性名称的现有文档集合,例如post.title.
文档似乎表明不需要将文档映射到具有 pascal-cased 属性名称的 C# POCO,例如:
public class Post
{
public ObjectId Id { get; set; }
public string Title { get; set; }
public string[] Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,在尝试查询集合时,出现异常:
元素“title”与 MongoDBDemo.Post 类的任何字段或属性都不匹配。
如果变Post.Title到Post.title查询成功执行。
有没有办法告诉驱动程序反序列化为 pascal-cased 属性并默认序列化为驼峰式属性?
我有一个带有一些属性的文档类型,其中之一是 Dictionary<string, string>。
序列化和反序列化似乎工作正常(我可以搜索、执行 CRUD 操作等)。问题是我正在尝试编写一种方法来查找该类型的所有对象,其中字典在其键中包含特定值 (id)。
尝试查询:
var objectCollection = db.GetCollection<MyClass>("MyClass");
var query = Query<MyClass>.Where(m => m.MyDictionary.Any(k => k.Key == id));
Run Code Online (Sandbox Code Playgroud)
班上:
public class MyClass
{
public ObjectId Id { get; set; }
// ...
[BsonElement("Dictionary")]
public Dictionary<string, string> MyDictionary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...但我在构建查询时遇到此异常:
Any requires that the serializer specified for Dictionary support items by implementing
MongoDB.Bson.Serialization.IBsonArraySerializer and returning a non-null result.
MongoDB.Bson.Serialization.Serializers.DictionarySerializer`2[System.String,System.String]
is the current serializer.
Run Code Online (Sandbox Code Playgroud)
我怀疑这个问题与 c# 驱动程序的默认序列化程序不支持这一事实有关。有解决方法吗?
我还尝试对集合中的id字符串执行“包含” Dictionary.Keys,但这给出了一个 …
我想允许DiskUse:true。但是,我找不到任何解释为 MongoDB C# 驱动程序启用 allowDiskUse 的示例。
如何在 MongoDB C# 驱动程序中启用 allowDiskUse?
我的示例代码是这样的
var pipeline = new[] { match, project, group, limit, sort, allow };
List<SMBMostInfluentialUser> result = db
.GetCollection<SMBTwitterStatus>("TwitterStatus")
.Aggregate(pipeline).ResultDocuments.Select(x =>
new User
{
Influence = Convert.ToDouble(x["Influence"]),
User = new SMBUser((BsonDocument)x["User"])
}).ToList();
Run Code Online (Sandbox Code Playgroud) 我有一个使用 mongodb 作为底层存储的 RESTful 后端。我正在使用 c# 驱动程序。文档说明 mongo 自行管理其连接池。
问题是:要与 mongodb 通信,我需要以下实现的实例
IMongoClientIMongoDatabaseIMongoCollection<T>管理这些对象生命周期的最佳实践是什么?我可以在每个服务器(应用程序域)中使用单例生活方式存储它们,或者我可以根据请求继续创建它们。目前仅针对IMongoCollection<T>每个请求。
我正在使用 C# 驱动程序测试 MongoDB (3.0),我注意到一些奇怪的事情。
我开始 test db localy 然后我创建了测试控制台应用程序。在那里,我这样做是为了初始化驱动程序:
var client = new MongoClient();
var database = client.GetDatabase("test");
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但后来我尝试根据 id(默认索引)获取数据,所以我添加了以下内容:
var collection = database.GetCollection<BsonDocument>("myData");
var filter = Builders<BsonDocument>.Filter.Eq("id", "F1234");
var result = collection.Find(filter).ToListAsync().Result;
Run Code Online (Sandbox Code Playgroud)
为了获得平均时间消耗,我添加了代码来测量查询的时间(通过用两个 DateTime.Now 装饰它然后减去它们 - 我知道,脏)并将所有代码放入循环中。另外,我让每次迭代时间显示在控制台上
现在每次我按 F5,第一次迭代大约需要 150 毫秒,但下一次迭代平均约为 1 毫秒。重要的是,这与缓存无关,因为每次迭代都可以查询不同的 id 并且结果完全相同。此外,我可以在每次迭代时再次初始化 MongoClient,但它的行为始终如我所描述的那样。
应用程序启动后的每个第一次查询都需要更多时间。
我需要知道,这是否真的是由于 MongoClient 内部的一些初始化(也许某些静态类是通过第一次查询进行初始化的?),或者这是否可以在运行应用程序时随时发生。
注意:我还尝试用 Thread.Sleep 替换查询,以确保它不是某些 .NET 问题。事实并非如此。确实是“collection.Find”在第一次使用时需要更多时间。
谢谢!
一段时间后注意
所以过了一段时间,我发现每个 CRUD 操作都需要它的“预热第一请求”。有时每个集合上的每个 CRUD 操作。奇怪的。我发布这个是为了让其他人知道:-)
我可以序列化一个FilterDefinition<T>json字符串来查看引擎盖下的内容吗?或者只通过日志和更详细的数据库分析器设置?
我在c#中有以下查询:
var filter = Builders<ME_UserInbox>.Filter.And(
Builders<ME_UserInbox>.Filter.Eq(n => n.UserId, userId),
Builders<ME_UserInbox>.Filter.ElemMatch(inbx => inbx.Inbox, msg => msg._id == msgId));
var update = Builders<ME_UserInbox>.Update.PullFilter(inbx => inbx.Inbox, msgs => msgs._id == msgId);
var upsert = new UpdateOptions()
{
IsUpsert = false
};
await collection.FindOneAndUpdateAsync(filter, update, upsert);
Run Code Online (Sandbox Code Playgroud)
现在,如果我.Result在最后一行之后写.在更新之前或之后获取文档?
TIA.