标签: mongodb-.net-driver

使用MongoDb存储System.Type

当我存储这个类时:

class MyClass{
    ...
    public Type SomeType {get;set;} 
    ...
}
Run Code Online (Sandbox Code Playgroud)

SomeType属性像这样序列化:

"SomeType" : {
    "_t" : "RuntimeType"
}
Run Code Online (Sandbox Code Playgroud)

并且每个后续查询都失败.

我正在使用官方的C#驱动程序.如何让它存储实际类型?谢谢.

mongodb mongodb-.net-driver

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

不区分大小写的属性映射

将 MongoDB 文档序列化为 POCO 时,有没有办法使属性映射不区分大小写?例如我想要这个文件:

{
    "id": "1"
    "foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

映射到这个类:

public MyObj
{
    public int Id {get; set;}
    public string Foo {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-.net-driver

1
推荐指数
2
解决办法
3689
查看次数

MongoDB C# 2.0 驱动程序:每个 Web 应用程序分别有多少个 MongoClients 套接字?

通常,您只需为给定集群创建一个 MongoClient 实例并在您的应用程序中使用它。但是,当且仅当连接字符串相同时,创建多个 MongoClient 仍将共享相同的连接池。

来源:http : //mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/

我们的情况是我们有两个不同的“集群”。

我们不使用复制或分片,但我们有两个不同的数据库。

这意味着我们的一些 API 函数将从一个数据库中获取数据,而其他 API 函数从第二个数据库中获取数据。这是硬编码的。

我们在每个类中创建了一个 SelectDatabase 方法,然后使用给定的设置创建一个 MongoClient。

同一个类将始终访问同一个数据库。

我预计驱动程序会以“最佳方式”处理秒数。

但事实证明,每次我刷新浏览器时,都会完成一个新的 Web API 控制器调用,因此也是一个新的 SelectDatabase 调用。这导致每次都有一个新的套接字(用 TCPView 检查)。

所以当然每个 API Controller 调用都应该导致 SelectDatabase,但我认为每次都创建一个套接字是一种矫枉过正。

我们正在创建这样的新 MongoClients:

//Creating multiple MongoClients will, however, still share the same pool of connections 
//if and only if the connection strings are identical.          
MongoClientSettings clientSettings1 = new MongoClientSettings()
{
    Server = new MongoServerAddress(host, port),
    ClusterConfigurator = builder =>
    {
        builder.ConfigureCluster(settings => settings.With(serverSelectionTimeout: TimeSpan.FromSeconds(serverSelectionTimeoutInSeconds)));
    }
}; …
Run Code Online (Sandbox Code Playgroud)

c# sockets mongodb asp.net-web-api mongodb-.net-driver

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

: MongoDB.Driver.MongoConnectionException: 打开与服务器的连接时发生异常

因此,我使用MongoDB了一个Azure VM并且我在 Azure 网站上托管了一个网站作为服务。我的问题是:有时我会收到这样的错误:

“异常:MongoDB.Driver.MongoConnectionException:打开与服务器的连接时发生异常。---> System.Net.Sockets.SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或建立的连接失败,因为连接的主机未能响应”

收到此错误后,只需再次访问端点即可立即成功。

细节:

连接字符串:mongodb://xxx.aaa.net:1000, xxx.aaa.net:1001, xxx.aaa.net:1002/?readPreference=nearest

在打开与 Mongo 的连接之前,我将 MaxConnectioIdleTimeout 属性设置为“MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromSeconds(30);” , 保持活动连接,因为 azure LoadBalancer 的空闲超时默认在 4 分钟后变为非活动状态。

所以,我不知道发生了什么。

有谁能够帮助我?

c# azure mongodb mongodb-.net-driver

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

如何使用 c# 驱动程序为针对 mongo 的单个查询设置 readPreference

我有一个应用程序使用了许多不同的 mongo 数据库,并且 99% 的时间它需要从副本集的主数据库中读取,但是我有几个报告查询会拉回大量数据并且没有被索引覆盖,我希望他们与次要竞争。有什么方法可以为单个查询指定它应该具有次要读取首选项。我想避免有更多的连接字符串,因为我在应用程序中已经有近十个了。

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

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

在MongoDb上序列化只读属性

使用C#6,我可以编写:

public class Person
{
    public Guid Id { get; }
    public string Name { get; }
    public Person(Guid id, string name)
    {
        Id = id;
        Name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,MongoDb驱动程序无法正确地序列化这样的类,属性也无法序列化。

MongoDb仅在默认情况下使用getter和setter序列化属性。我知道您可以手动更改类映射,并告诉序列化程序包括仅获取属性,但是我一直在寻找避免自定义每个映射的通用方法。

我正在考虑创建一个类似于ReadWriteMemberFinderConvention的自定义约定,但不进行CanWrite检查。

还有其他解决方案吗?构造函数将被自动调用,还是需要其他自定义?

serialization mongodb bson c#-6.0 mongodb-.net-driver

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

MongoDb c#驱动连续SelectMany

如果我有对象,让它们称为Group,其中包含一些其他对象的列表,我将其称为Brand,并且该对象具有一个名为Model的对象列表。

有没有办法只获取使用 MongoDb c# 驱动程序的模型列表。

我多次尝试使用SelectMany但没有成功。如果我放了多个SelectMany,我总是得到一个空列表。

代码应该是不言自明的。最后是解释什么让我感到困惑的评论。

class Group
{
    [BsonId(IdGenerator = typeof(GuidGenerator))]
    public Guid ID { get; set; }
    public string Name { get; set; }
    public List<Brand> Brands { get; set; }
}

class Brand
{
    public string Name { get; set; }
    public List<Model> Models { get; set; }
}

class Model
{
    public string Name { get; set; }
    public int Produced { get; …
Run Code Online (Sandbox Code Playgroud)

c# mongodb-.net-driver

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

在聚合框架C#中使用构面

我想在我的数据上创建一个汇总,以获取.Net应用程序中书籍集合的特定标签的总数。

我有以下图书课。

public class Book
{
    public string Id { get; set; }

    public string Name { get; set; }

    [BsonDictionaryOptions(DictionaryRepresentation.Document)]
    public Dictionary<string, string> Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

数据保存后,将以以下格式存储在MongoDB中。

{ 
    "_id" : ObjectId("574325a36fdc967af03766dc"), 
    "Name" : "My First Book", 
    "Tags" : {
        "Edition" : "First", 
        "Type" : "HardBack", 
        "Published" : "2017", 
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直在MongoDB中直接使用构面,并且可以通过使用以下查询来获得所需的结果:

db.{myCollection}.aggregate(
    [
        {
            $match: {
                "Name" : "SearchValue"
            }
        },
        {
            $facet: {
                 "categorizedByTags" : [ 
                     {   
                       $project :
                       { 
                         Tags: { $objectToArray: "$Tags" } …
Run Code Online (Sandbox Code Playgroud)

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

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

C#MongoDB未序列化System.Security.Claims.Claim

我似乎无法序列化Claim-我在做什么错?使用此方法的其他对象序列化工作正常。

var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("TEST");
var collection = database.GetCollection<Claim>("Claims");

var payload = new Claim("name", "value");
collection.InsertOne(payload);
Run Code Online (Sandbox Code Playgroud)

结果

一个对象被插入到MongoDB中,但除了_id设置/填充外,别无其他。

在此处输入图片说明

使用.NET Core 2.0.x和MongoDB.Driver 2.5.0。

更新1

手动映射成员似乎有效;只是在自动映射时,它似乎失败了。

BsonClassMap.RegisterClassMap<Claim>(cm =>
{
    cm.SetIgnoreExtraElements(true);
    cm.MapMember(c => c.Issuer);
    cm.MapMember(c => c.OriginalIssuer);
    cm.MapMember(c => c.Properties);
    cm.MapMember(c => c.Subject);
    cm.MapMember(c => c.Type);
    cm.MapMember(c => c.Value);
    cm.MapMember(c => c.ValueType);
    cm.MapCreator(c => new Claim(c.Type, c.Value, c.ValueType, c.Issuer, c.OriginalIssuer, c.Subject));
});
Run Code Online (Sandbox Code Playgroud)

c# mongodb mongodb-.net-driver

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

MongoDB .NET驱动程序按时间范围分组

我是MongoDB的新手,想知道如何计算从UTC时间12 AM到当前UTC时间每15分钟间隔插入集合中的文档总数。

以下是样本文件

{
    "_id" : ObjectId("5ade8bfc6b941c7726a54f01"),
    "Country" : "US"
    "Timestamp" : ISODate("2018-04-24T01:44:28.040Z"),
}
Run Code Online (Sandbox Code Playgroud)

这是预期的输出:

{
    "Count": 245,
    "ReceiveDateString": "5/2/2018 12:00:00 AM"
},
{
    "Count": 239,
    "ReceiveDateString": "5/2/2018 12:15:00 AM"
},
{
    "Count": 252,
    "ReceiveDateString": "5/2/2018 12:30:00 AM"
},
{
    "Count": 255,
    "ReceiveDateString": "5/2/2018 12:45:00 AM"
},
{
    "Count": 242,
    "ReceiveDateString": "5/2/2018 1:00:00 AM"
}
.
.
.

and so on until current UTC time.
Run Code Online (Sandbox Code Playgroud)

我可以按分钟分组,如下所示:

var filter = Builders<Model>.Filter.Where(r => r.Timestamp > startDate && r.Timestamp < endDate);
var result …
Run Code Online (Sandbox Code Playgroud)

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

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