我需要使用 IBsonSerializer 实现自定义序列化器。
这就是我所做的:
internal class MyCustomDateTimeSerializer : IBsonSerializer
{
public object Deserialize(BsonDeserializationContext context,
BsonDeserializationArgs args)
{
// Deserialization logic
}
public void Serialize(BsonSerializationContext context,
BsonSerializationArgs args, object value)
{
// Serialization logic
}
public Type ValueType => typeof(DateTime);
}
Run Code Online (Sandbox Code Playgroud)
然后在 BsonSerializerAttribute 中使用它:
[BsonSerializer(typeof(MyCustomDateTimeSerializer))]
Run Code Online (Sandbox Code Playgroud)
我的问题是我想序列化/反序列化 DateTime 和 Nullable DateTime。
我的 CustomSerializer 的 ValueType 设置为 typeof(DateTime),因此我得到如下异常:
序列化程序的值类型为 System.DateTime 且与成员类型 System.Nullable`1[[System.DateTime..
我没有找到这个问题的任何解决方案。当然,我可以为 Nullable DateTime 和 DateTime 创建两个不同的类,但也许还有另一种选择?
我正在尝试连接到 MongoDb 数据库。
通过连接字符串进行身份验证正在工作:
public MongoDbContext(AppSettings appSettings)
{
var connectionString = "mongodb://myUsername:myPassword@myDomain.com:27017/myDatabaseName";
_client = new MongoClient(connectionString);
// ...
}
Run Code Online (Sandbox Code Playgroud)
MongoClientSettings 的身份验证不起作用:
public MongoDbContext(AppSettings appSettings)
{
var credentials = MongoCredential.CreateMongoCRCredential(databaseName: "myDatabaseName", username: "myUsername", password: "myPassword");
var server = new MongoServerAddress(host: "myDomain.com", port: 27017);
var mongoClientSettings = new MongoClientSettings
{
Credential = credentials,
Server = server,
ConnectionMode = ConnectionMode.Standalone,
ServerSelectionTimeout = TimeSpan.FromSeconds(3)
}; …Run Code Online (Sandbox Code Playgroud) 由于工作中的环境限制,我正在 MongoDB 中实现一个粗略的事件源存储。我正在尝试从 Mongo 获取列表,IClientEvents如下所示:
var events = await _db.GetCollection<IClientEvent>("ClientEvents").FindAsync(c => c.ClientId == clientId);
Run Code Online (Sandbox Code Playgroud)
当我运行上述存储库方法时,出现以下异常:
Message: System.InvalidOperationException : {document}.ClientId is not supported.
Run Code Online (Sandbox Code Playgroud)
接口IClientEvent定义为:
public interface IClientEvent
{
Guid Id { get; set; }
long TimeStamp { get; set; }
Guid ClientId { get; set; }
}
public class ClientChangedEvent : IClientEvent
{
public Guid Id { get; set; }
public long TimeStamp { get; set; }
public Guid ClientId { get; set; }
public IEnumerable<Change> Changes; …Run Code Online (Sandbox Code Playgroud) 我需要在我的 C# 代码中在 MongoDB 中运行以下查询。我使用 MongoDB.Driver 2.7.2 和 MongoDB 4.0。
我想使用 $lookup 而不是 $project / $unwind 以防止命名集合的每个可能字段。
db.getCollection('Collection1').aggregate([
{ "$match" : { "Id" : 1 } },
{ "$lookup": {
"from": "Collection2",
"let": { collection1Id : "$Id" },
"pipeline": [
{ $match:
{ $expr:
{ $and:
[
{ $eq : [ "$Collection1Id", "$$collection2Id" ] },
{ $in : [ "$_id" , [1, 2, 3]] }
]
}
}
}
],
"as": "item"
}
}
])
Run Code Online (Sandbox Code Playgroud)
我期望在多个连接条件下 Collection1 与 Collection2 连接的输出。
这个问题与这个问题的原理完全相同,但是当该对象嵌套在集合的数组中时,我想在对象属性上使用强类型方法创建索引。
我可以用:
new CreateIndexModel<T>( Builders<T>.IndexKeys.Ascending( a ) )
Run Code Online (Sandbox Code Playgroud)
其中a是访问直接属性的表达式。
但我没有发现类似的内容:
Builders<Library>.Filter.ElemMatch(x => x.Author.Books, b => b.IsVerified == false));
Run Code Online (Sandbox Code Playgroud)
这样我就可以将嵌套在数组中的对象的某些字段定义为索引,该数组是集合的成员。
是否可以做到以及如何做到?
当我Id在 MongoDB 存储设置中重写派生类中的属性时,遇到了大问题。
我的所有数据模型继承的基类如下所示:
public abstract class DataModel
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public virtual string Id { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
public DateTime Deleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后有一些使用upserts 的特定子数据模型。这需要我根据这个答案Id注释被覆盖的属性:[BsonIgnoreIfDefault]
public class ChildDataModel : DataModel
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
[BsonIgnoreIfDefault] // <---- need this for Upserts to work
public override string Id { get; set; }
... // child-specific properties …Run Code Online (Sandbox Code Playgroud) mongoDB 中是否有使用 .Net 创建某种与“SQL-Join”等效的东西?我已阅读有关关系的 MongoDB 文档(https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships- Between-documents/ )..据我了解,您只需添加通过引用他们的 ID 来建立关系。然而..这是否也意味着对于每个关系,您还需要执行一个额外的查询?..
我使用 MongoDB 的 Compass 创建了一个导出到 C# 的管道,但是我不确定如何在实际代码中使用它(工具生成 BsonArray)来执行聚合?这是 LINQ 目前不支持的 geoNear(如果有任何方位的话)。
我尝试使用一些文档var result = collection.Aggregate(pipeline);建议的(管道 - 是 Compass 生成的 BsonArray 对象)。
指南针将创建的示例:
new BsonArray
{
new BsonDocument("$geoNear",
new BsonDocument
{
{ "near",
new BsonDocument
{
{ "type", "Point" },
{ "coordinates",
new BsonArray
{
-2.11,
52.55
} }
} },
{ "distanceField", "distanceField" },
{ "maxDistance", 5000 },
{ "spherical", true }
}),
new BsonDocument("$sort",
new BsonDocument("distanceField", -1))
};
Run Code Online (Sandbox Code Playgroud) 我有一个类,里面有一个枚举属性。由于以下文档的 .NET 表示形式中的属性,在保存整个文档时,该属性会作为字符串写入数据库
public enum Status { Good, Bad }
public class Document
{
[BsonRepresentation(BsonType.String)]
public Status Status { get; set; }
// ...
}
Run Code Online (Sandbox Code Playgroud)
稍后,当我想要更新文档中的值而不保存整个文档时,我构建一个如下过滤器:
var builder = Builders<T>.Update;
var filter = builder.Set(new StringFieldDefinition<T, Status>(fieldName), (Status)value);
var result = await Context.Collection.UpdateManyAsync(filter, update);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会写入枚举的整数值。
如果我将过滤器更改为这个
var filter = builder.Set(new StringFieldDefinition<T, Status>(fieldName), value.ToString());
Run Code Online (Sandbox Code Playgroud)
司机会抛出一个InvalidCastException。如何正确构建过滤器?有没有另一种方法可以直接设置枚举值而不替换文档?
我想到可能有一种方法可以将单字段行为与整个文档的属性相关联,但我似乎不知道如何做到这一点。
public class User
{
public string Id { get; private set; }
public string Name { get; private set;}
public bool IsActive{ get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 MongoDB 驱动程序构建一个 .Net 应用程序来连接到 Mongo。一些已实现的实体有一个 IsActive 字段 - 基本上是一个布尔值,如果实体处于活动状态,则设置为 true;如果实体已被删除,则设置为 false。(如果愿意的话,可以进行软删除或逻辑删除)
我的目标是应用一个“全局过滤器”,它将成为应用于给定集合的任何过滤器的基础。类似于 EF Core 全局查询过滤器https://learn.microsoft.com/en-us/ef/core/querying/filters
MongoDB 驱动程序有类似的东西吗?如果没有,你们中有人对如何以其他方式实现这一点有建议吗?