当我存储这个类时:
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 文档序列化为 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) 通常,您只需为给定集群创建一个 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) 因此,我使用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 分钟后变为非活动状态。
所以,我不知道发生了什么。
有谁能够帮助我?
我有一个应用程序使用了许多不同的 mongo 数据库,并且 99% 的时间它需要从副本集的主数据库中读取,但是我有几个报告查询会拉回大量数据并且没有被索引覆盖,我希望他们与次要竞争。有什么方法可以为单个查询指定它应该具有次要读取首选项。我想避免有更多的连接字符串,因为我在应用程序中已经有近十个了。
c# mongodb mongodb-query mongodb-csharp-2.0 mongodb-.net-driver
使用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检查。
还有其他解决方案吗?构造函数将被自动调用,还是需要其他自定义?
如果我有对象,让它们称为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) 我想在我的数据上创建一个汇总,以获取.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) 我似乎无法序列化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) 我是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)