标签: mongodb-.net-driver

我应该使用哪个驱动程序来运行 mongoDB

我想知道以下哪个驱动程序最好:

mongodb-csharp driver
simple-mongodb driver
NoRM 
Run Code Online (Sandbox Code Playgroud)

哪个认为最好!>

mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
253
查看次数

在 MongoDB 中使用嵌套数组保存字典

以下类应由 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 应用于属性

Json.NET:反序列化嵌套字典

CustomCreationConverter 源代码

public class Something
{
    ...
    [JsonProperty(ItemConverterType = typeof(CustomConverter))] …
Run Code Online (Sandbox Code Playgroud)

c# serialization json.net mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
4908
查看次数

MongoDB:使用 C# 驱动程序更新除 _id 之外的整个文档

我必须更新除_id 之外的所有字段。我想避免手动更新 16 个字段...所有新字段都存储在 BsonDocument 中

谢谢你的想法

mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
4803
查看次数

MongoDB C# 驱动程序不会自动映射 pascal-cased 属性

我正在使用官方的 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.TitlePost.title查询成功执行。

有没有办法告诉驱动程序反序列化为 pascal-cased 属性并默认序列化为驼峰式属性?

mongodb mongodb-.net-driver

5
推荐指数
2
解决办法
2522
查看次数

MongoDB c# 驱动程序 - 在序列化字典中执行 LINQ“Any”

我有一个带有一些属性的文档类型,其中之一是 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,但这给出了一个 …

c# linq mongodb mongodb-query mongodb-.net-driver

5
推荐指数
1
解决办法
3601
查看次数

使用 MongoDB C# 驱动程序在聚合框架中使用 allowDiskUse

我想允许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)

c# mongodb aggregation-framework mongodb-.net-driver

5
推荐指数
2
解决办法
5448
查看次数

在 Web 应用程序中管理 MongoDB 对象生命周期

我有一个使用 mongodb 作为底层存储的 RESTful 后端。我正在使用 c# 驱动程序。文档说明 mongo 自行管理其连接池。

问题是:要与 mongodb 通信,我需要以下实现的实例

  • IMongoClient
  • IMongoDatabase
  • IMongoCollection<T>

管理这些对象生命周期的最佳实践是什么?我可以在每个服务器(应用程序域)中使用单例生活方式存储它们,或者我可以根据请求继续创建它们。目前仅针对IMongoCollection<T>每个请求。

.net c# mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
599
查看次数

应用程序启动后第一次查询的 MongoDb C# 驱动程序很慢

我正在使用 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 操作。奇怪的。我发布这个是为了让其他人知道:-)

c# performance driver mongodb mongodb-.net-driver

5
推荐指数
0
解决办法
1279
查看次数

使用C#驱动程序v2 API调试MongoDB查询

我可以序列化一个FilterDefinition<T>json字符串来查看引擎盖下的内容吗?或者只通过日志和更详细的数据库分析器设置?

c# mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
883
查看次数

c#mongo 2.0驱动程序在FindOneAndUpdateAsync之后获取项目

我在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.

c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

5
推荐指数
1
解决办法
3186
查看次数