如何在使用C#驱动程序的MongoDB中使用$currentdate

3
我正在尝试编写以下查询,以使用C#中的服务器端时间更新时间。
db.users.update(
    { _id: 1 },
    {
        $currentDate:
        {
            lastModified: true,
            lastModifiedTS: { $type: "timestamp" }
        }
    })

请问如何通过C#代码运行此命令,需要使用哪个驱动程序版本?

2个回答

3

大约一年后,我偶然发现了这个问题,需要做同样的事情,并进行了一些研究。

我在官方mongo驱动程序的1.9.2版本中找到了这种有趣的方式:

var query = Query.EQ("_id", 1);
var update = Update
   .Set("field_timestamp_local", DateTime.Now)
   .CurrentDate("field_timestamp_mongo");
collection.Update(query, update);

这段代码将两个字段设置为时间戳,第一个字段是本地客户端时间戳,第二个字段是服务器时间戳。


1
这不是服务器时间! - conceptacid
3
第一个字段是本地时间,第二个字段实际上设置为服务器时间!我进行了编辑以使其更加清晰。 - Sunib
2
有没有关于如何通过插入(在创建文档时使用.CurrentDate在字段上)来实现相同结果的建议? - Alex 75
1
@Alex75,我也需要这个功能,但目前看起来除非你使用upsert更新,否则不可能实现。有一个开放的Jira工单来解决这个问题: https://jira.mongodb.org/browse/SERVER-13695 - BSSchwarzkopf

3

由于$currentDate是即将发布的2.6版本的新功能,因此您当前使用的驱动程序可能不支持它。您可以使用BSON文档而不是强类型包装器来执行它:

collection.Update(
  new QueryDocument() { { "_id", 1 } }, 
  new UpdateDocument() { 
    { "$currentDate", new BsonDocument {
      { "lastModified", true },
      { "lastModifiedTS", new BsonDocument { { "$type", "timestamp" } } }
    } } 
  });

我假设C#驱动程序的下一个版本将支持针对此功能的强类型助手。

жҲ‘иҝҳжңүдёҖдёӘй—®йўҳгҖӮжҲ‘们еҰӮдҪ•дҪҝз”Ё$currentDateиҺ·еҸ–жңҚеҠЎеҷЁз«Ҝж—Ҙжңҹж—¶й—ҙгҖӮжҲ‘дёҚжғіжӣҙж–°йӣҶеҗҲдёӯзҡ„д»»дҪ•еӯ—ж®өгҖӮжҲ‘еҸӘйңҖиҰҒеңЁжҲ‘зҡ„д»Јз ҒдёӯиҺ·еҸ–ж—Ҙжңҹж—¶й—ҙ并еңЁйӮЈйҮҢдҪҝз”Ёе®ғгҖӮи°ўи°ўпјҒ - Vibs
据我所知,没有简单的方法可以做到这一点。您可以使用“eval”来请求服务器为您评估“new Date()”,但这不是一个好主意。也许有一种方法可以强制DB为您生成ObjectID,从中您可以提取时间戳。 - Avish
谢谢Avish!我能够从ServerStatus命令结果中提取日期。 - Vibs
根据您执行此操作的频率,使用serverStatus可能会遇到性能问题,因为它相对昂贵。 - Avish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接