2016-04-23 9 views
1
@Document 
public class Product extends Item { 
    private Date onlineDate; 

    private Date offlineDate; 
} 

DatenVergleichen mit null Datum in Bereich

Product { 
    onlineDate : some date 
    offlineDate : null 
} 

unter Abfrage return 0 Treffer

query.addCriteria(Criteria.where("onlineDate").lte(date).and("offlineDate").gte(date)) 

aber unter Abfrageergebnisse liefern

query.addCriteria(Criteria.where("onlineDate").lte(date)) 

ist etwas, das ich bin nicht erlaubt mit Nulldatum zu vergleichen.

Antwort

1

Sie müssen in den Ergebnissen grundsätzlich Bedingungen enthalten, um die null zu akzeptieren. Jetzt fragen Sie "ist größer als" ein geliefertes Datum, und null ist nicht "größer als", daher ist es ausgeschlossen.

Dies bedeutet eine $or Bedingung Zugabe zu den beiden möglichen Zustände auf diesem Gebiet zu testen:

Criteria criteria = Criteria.where("onlinedate").lte(date).orOperator(
    Criteria.where("offlinedate").gte(date), 
    Criteria.where("offlinedate").is(null) 
); 

Query query = new Query().addCriteria(criteria); 

System.out.println(query.getQueryObject()); 

Was würde Ihnen:

{ 
    "onlinedate" : { "$lte" : date } , 
    "$or" : [ 
     { "offlinedate" : { "$gte" : date } } , 
     { "offlinedate" : null } 
    ] 
} 

, dass die richtige Übersetzung ist der Änderung Ihrer Anfrage zu ermöglichen, Der null Wert, aber es macht mich denken, dass Ihr Grundgedanken auf die Abfrage falsch ist, da dies Ergebnisse zurückgeben würde, die im Grunde sagen "noch online". Das mag sein, was du willst, aber dann hast du vielleicht etwas anderes gefragt. Wenn

in der Tat haben Sie gesucht „all“ Dokument, das tat nicht haben die mitgelieferte date Wert „betweeen“ die beiden Werte in dem Dokument, dann würden Sie stattdessen „invertieren“ den Bereich Ausdrücke Dokumente anzupassen „zwischen „und dann‚invertieren‘das Ergebnis mit $nor statt:

Criteria criteria = new Criteria().norOperator(
    Criteria.where("onlinedate").gte(date) 
    .and("offlinedate").lte(date) 
); 

Query query = new Query().addCriteria(criteria); 

System.out.println(query.getQueryObject()); 

, die in einer Abfrage wie folgt ergibt:

{ 
    "$nor" : [ 
     { 
      "onlinedate" : { "$gte" : date }, 
      "offlinedate" : { "$lte" : date } 
     } 
    ] 
} 

Welche ist Ergebnisse liefern sowohl“ vor dem e "und" nach "der Bereich zwischen den beiden Datumseigenschaften, oder wo das "offline" Datum war null und der Bereich ist nicht" geschlossen ".

Es davon abhängt, welche Satz von Ergebnissen Sie eigentlich wollen, entweder sein, dass Sie die null Werte umfassen die Daten zu finden, die „noch offen“ ist, oder Sie „ausschließen den Bereich“, um nur die Daten zu finden, die sich außerhalb des fallen Bereich stattdessen.