以下问题How to update a generic type with MongoDB C# driver的代码不再起作用,如何在MongoDB 2.7中执行相同的操作?
void Update(T entity)
{
collection.Save<T>(entity);
}
答案 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 } );
}
}