我想在 C# 的聚合查询中将 MongoDB 函数 (
new Date()
) 作为原始函数传递。我希望在我的 MongoDB 视图中,结果应该如下所示:
$and: [
{
create: {
$lte: new Date()
}
}
]
但是,当我尝试使用
new BsonDocument
、literal
、BsonJavaScript
或 BsonString
时,我总是会得到类似的结果:
$lte: "new Date()"
或
$lte: Code("new Date()")
由于我的聚合管道非常大,我不想将所有内容都作为 JSON 字符串发送。我只是想在我看来
new Date()
不带引号。
这是我当前代码的一部分:
var pipeline = new List<BsonDocument>
{
new BsonDocument("$match", new BsonDocument("$and", new BsonArray
{
new BasicDBObject("create", new BsonDocument("$lte", new BsonDocument("new Date()"))),
new BasicDBObject("end", new BsonDocument("$gte", new BsonDocument("new Date()")))
}))
};
任何人都可以帮我调整这个,以便
new Date()
正确通过吗?
正如评论中提到的,您应该使用 c#
DateTime
类。如果渲染管道,您可以看到结果:
var pipeline = new EmptyPipelineDefinition<BsonDocument>()
.Match(new BsonDocument("$and", new BsonArray
{
new BsonDocument("create", DateTime.UtcNow),
new BsonDocument("end", DateTime.UtcNow)
}));
// render for driver version 3.0:
var registry = BsonSerializer.SerializerRegistry;
var rendered = pipeline.Render(new RenderArgs<BsonDocument>
{
SerializerRegistry = registry,
DocumentSerializer = registry.GetSerializer<BsonDocument>()
})
.Documents
.Single()
.ToString();
输出:
{
"$match": {
"$and": [
{
"create": {
"$lte": {
"$date": "2024-12-09T20:19:34.97Z"
}
}
},
{
"end": {
"$gte": {
"$date": "2024-12-09T20:19:34.979Z"
}
}
}
]
}
}
作为一个选项,可以将日期配置为惰性:
new BsonDocument
{
{ "create", () => DateTime.UtcNow, true }
},
不,我不能使用 DateTime.Now,因为它将被保存为恒定日期来查看 - 正如您在自己的输出中看到的那样。
我使用了 $$now 函数 - 它按预期工作,所以谢谢乔!