如何在聚合查询中将 MongoDB new Date() 函数作为原始数据传递

问题描述 投票:0回答:2

我想在 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# mongodb bson
2个回答
1
投票

正如评论中提到的,您应该使用 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 }
    },

0
投票

不,我不能使用 DateTime.Now,因为它将被保存为恒定日期来查看 - 正如您在自己的输出中看到的那样。

我使用了 $$now 函数 - 它按预期工作,所以谢谢乔!

© www.soinside.com 2019 - 2024. All rights reserved.