13
public class ScheduledEvent : Event
{
    public DateTimeOffset StartDateTime { get; set; }
}

StartDateTime = 2013 年 5 月 27 日 2:09:00 AM + 00:00 は、2013 年 5 月 26 日 07:09 PM PST を表します

MongoDB に記録される内容:

> db.ScheduledEvent.find().toArray()
[
        {
                "_id" : BinData(3,"ZE2p31dh00qb6kglsgHgAA=="),
                "Title" : "Today 26th at 7:09pm",
                "Length" : "00:00:00",
                "MoreInformation" : "http://1.com",
                "Speakers" : [
                        {
                                "_id" : BinData(3,"ndzESsQGukmYGmMgKK0EqQ=="),
                                "Name" : "Mathias Brandewinder"
                        }
                ],
                "Location" : {
                        "_id" : BinData(3,"AAAAAAAAAAAAAAAAAAAAAA=="),
                        "Name" : "Somwhere "
                },
                "Organizers" : [
                        {
                                "_id" : BinData(3,"AAAAAAAAAAAAAAAAAAAAAA=="),
                                "Name" : null
                        }
                ],
                "CreatedOn" : [
                        NumberLong("635052144104050898"),
                        0
                ],
                "StartDateTime" : [
                        NumberLong("635052173400000000"),
                        0
                ]
        }
]

StartDateTime が MongoDB に Ticks として格納されていることを認識しています。

var dateMarker = DateTimeOffset.UtcNow;
var nextDay = dateMarker.AddDays(1);

このクエリは機能しません:

var today = EventRepoistory.All().Where(z => z.StartDateTime >= dateMarker && z.StartDateTime < nextDay).OrderByDescending(z => z.StartDateTime).ToList();

次のクエリを表示するクエリ表示を Mongo C# ドライバーに追加しました。

{ "$query" : { "StartDateTime" : { "$gte" : [NumberLong("635052168609734070"), 0], "$lt" : [NumberLong("635053032609734070"), 0] } }, "$orderby" : { "StartDateTime" : -1 } }

下限 = 6350521 68609734070

サーバー = 6350521 73400000000

上限 = 6350530 32609734070

質問: MongoDB クエリが何も返さないのはなぜですか?

db.ScheduledEvent.find({ "$query" : { "StartDateTime" : { "$gte" : [NumberLong("635052168609734070"), 0], "$lt" : [NumberLong("635053032609734070"), 0] } }, "$orderby" : { "StartDateTime" : -1 } })

調査済み:

MongoDB と DateTimeOffset 型ですが、LINQ プロバイダーが本来の目的を果たしていると思われますか?

試した:

db.ScheduledEvent.find({ "StartDateTime" : { "$gte" : [NumberLong("1"), 0]  } }  )

結果を生成しません。

4

3 に答える 3

6

同様の回答がここにあります:MongoDBとDateTimeOffsetタイプ(質問に記載されているとおり)

次のようにして、C#ドライバーでこれを機能させました。

var query = Query.GT("StartDateTime.0", startDate.Ticks);
var json = query.ToJson();

この JSON を生成します。

{ "StartDateTime.0" : { "$gt" : NumberLong("635251617859913739") } }

上記の JSON は機能します。リンクされた回答によると、その理由は DateTimeOffset が配列であるためです。

LINQ を使用すると、(ご指摘のとおり) JSON に対して別の結果が得られます。

var query = from r in col.AsQueryable<MyObjectType>()
    where r.StartDateTime>= startDate && r.StartDateTime< endDate
    select r;

上記の LINQ クエリは、次の JSON を生成します。

{ "StartDateTime" : { "$gte" : [NumberLong("635251617859913739"), 0], "$lt" : [NumberLong("635251635859913739"), 0] } }

DateTimeOffset を処理するために C# ドライバーの LINQ プロバイダーを修正する必要があるかどうかはわかりませんが、クエリ ビルダーを使用して DateTimeOffset 配列の最初の要素 (StartDateTime.0) を指定することが、これを機能させる唯一の方法でした。

于 2014-01-12T22:51:59.800 に答える
1

クエリで次の構文を使用します。

{
    "StartDateTime.0": {
        "$gte": 635052168609734070
    }
}
于 2013-09-20T14:43:53.507 に答える