2013-05-27 5 views
9
public class ScheduledEvent : Event 
{ 
    public DateTimeOffset StartDateTime { get; set; } 
} 

StartDateTime = 2013/05/27 02:09:00 00: 00 che rappresenta 2013/05/26 19:09 PSTcorrettamente utilizzando/movimentazione DateTimeOffset in MongoDB

cosa è registrato in 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 
       ] 
     } 
] 

Mi rendo conto che StartDateTime è memorizzato come zecche in MongoDB.

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

Questa query non funziona:

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

Ho aggiunto un display query per il driver # Mongo C che mostra la seguente query:

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

Limite inferiore = 6.350.521 68609734070

Server = 6350521 7340000 0000

Limite superiore = 6350530 32609734070

Domanda: Perché l'interrogazione MongoDB non tornare nulla?

db.ScheduledEvent.find ({ "$ query": { "StartDateTime": { "$ gte": [NumberLong ("635.052.168.609,73407 milione"), 0], "$ lt": [NumberLong (" 635.053.032.609,73407 milione"), 0]}}, "$ orderby": { "StartDateTime": -1}})

Ricercato:

MongoDB and DateTimeOffset type ma cuciture che fornitore di LINQ sta facendo quello che si suppone?

provato:

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

produce alcun risultato.

+0

Ciao, sei mai arrivato in fondo a questo? Ho lo stesso problema ... – soupy1976

+0

Ho sospeso il mio progetto dopo questa scoperta. Non sono ancora tornato. –

risposta

2

Una risposta simile si trova qui: MongoDB and DateTimeOffset type (come si nota nella tua domanda)

ho ottenuto questo lavoro con il C# driver nel modo seguente:

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

Produce questo JSON:

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

Il suddetto JSON funziona. Per la risposta collegata la ragione è che DateTimeOffset è un array.

Quando uso LINQ ottengo (come hai notato) un risultato diverso per JSON.

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

La query LINQ sopra produce il seguente JSON:

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

Non sono sicuro se il provider LINQ nel driver C# deve essere risolto per gestire DateTimeOffset ma utilizzando il generatore di query per specificare i il primo elemento dell'array DateTimeOffset (StartDateTime.0) era l'unico modo per farlo funzionare.

+0

Sembra un anno dopo la situazione è ancora lì. Dovevo fare lo stesso. –

0

Usare la seguente sintassi nella query:

{ 
    "StartDateTime.0": { 
     "$gte": 635052168609734070 
    } 
}