标签: mongodb-.net-driver

为 MongoDb 处理可为空和不可为空类型的自定义序列化程序

我需要使用 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 创建两个不同的类,但也许还有另一种选择?

c# serialization mongodb mongodb-.net-driver

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

使用 MongoClientSettings 时无法进行身份验证

我正在尝试连接到 MongoDb 数据库。

  • 我的客户:带有 MongoDb.Driver 2.6.1 的 ASP.NET Core 2
  • 我的服务器:MongoDb 3.6.5 社区版,独立(无副本集),Windows Server 2016 上的 64 位。

通过连接字符串进行身份验证正在工作:

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)

c# mongodb-.net-driver

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

MongoDB C# 驱动程序 - 将集合序列化为接口

由于工作中的环境限制,我正在 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# interface mongodb event-sourcing mongodb-.net-driver

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

如何在 C# 中使用管道和 let 参数进行 $lookup (MongoDB.Driver 2.7.2)

我需要在我的 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 连接的输出。

c# mongodb mongodb-.net-driver

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

如何在 C# Mongodb 强类型驱动程序中基于嵌套数组元素创建索引

这个问题与这个问题的原理完全相同,但是当该对象嵌套在集合的数组中时,我想在对象属性上使用强类型方法创建索引。

我可以用:

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)

这样我就可以将嵌套在数组中的对象的某些字段定义为索引,该数组是集合的成员。

是否可以做到以及如何做到?

c# mongodb mongodb-.net-driver

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

MongoDB:子类的 ID 和属性被覆盖的问题

当我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)

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

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

MongoDB 中的关系(使用 .Net)

mongoDB 中是否有使用 .Net 创建某种与“SQL-Join”等效的东西?我已阅读有关关系的 MongoDB 文档(https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships- Between-documents/ )..据我了解,您只需添加通过引用他们的 ID 来建立关系。然而..这是否也意味着对于每个关系,您还需要执行一个额外的查询?..

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

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

如何在 C# 中使用 MongoDB Compass 生成的管道来运行聚合管道

我使用 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)

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

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

更改 MongoDB 文档中存储为字符串的枚举值

我有一个类,里面有一个枚举属性。由于以下文档的 .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。如何正确构建过滤器?有没有另一种方法可以直接设置枚举值而不替换文档?

我想到可能有一种方法可以将单字段行为与整个文档的属性相关联,但我似乎不知道如何做到这一点。

c# enums mongodb mongodb-.net-driver

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

如何在 MongoDB Driver for C# 中应用软删除过滤器?

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 驱动程序有类似的东西吗?如果没有,你们中有人对如何以其他方式实现这一点有建议吗?

c# soft-delete mongodb mongodb-.net-driver

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