如何在MongoDB 2.7中使用MongoDB C#驱动程序更新通用类型

时间:2018-10-03 19:53:14

标签: c# mongodb

以下问题How to update a generic type with MongoDB C# driver的代码不再起作用,如何在MongoDB 2.7中执行相同的操作?

void Update(T entity)
{
    collection.Save<T>(entity);
}

1 个答案:

答案 0 :(得分:2)

当前var epoch = Math.floor(Date.now() / 1000); console.log("ttl epoch is ", epoch); var queryTTLParams = { TableName : table, KeyConditionExpression: "id = :idval", ExpressionAttributeNames:{ "#theTTL": "TTL" }, FilterExpression: "#theTTL < :ttl", ExpressionAttributeValues: { ":idval": {S: "1234"}, ":ttl": {S: epoch.toString()} } }; 仅在旧版MongoDB C#驱动程序中可用。您可以在driver JIRA上找到有关讨论的未解决故障单。

仍然可以在C#中实现类似的功能。该行为已记录为here

  

如果文档不包含_id字段,则save()方法将调用insert()方法。在操作过程中,mongo shell将创建一个ObjectId并将其分配给_id字段。

  

如果文档包含_id字段,则save()方法等效于upsert选项设置为true且查询谓词位于_id字段的更新。

因此,您可以在C#中引入标记接口以表示Save字段:

_id

然后您可以像这样实现public interface IIdentity { ObjectId Id { get; set; } }

Save

或更简单:

public void Update<T>(T entity) where T : IIdentity
{
    if(entity.Id == ObjectId.Empty)
    {
        collection.InsertOne(entity); // driver creates _id under the hood
    }
    else
    {
        collection.ReplaceOne(x => x.Id == entity.Id, entity, new UpdateOptions() { IsUpsert = true } );
    }
}