Comparar dos campos de fecha en MongoDB

en mi colección cada documento tiene 2 fechas, modificado y sincronizado. Me gustaría encontrar aquellos que modificaron> sincronización, o la sincronización no existe.

Lo intenté

{'modified': { $gt : 'sync' }} 

Pero no está mostrando lo que esperaba. ¿Algunas ideas?

Gracias

No puede comparar un campo con el valor de otro campo con la coincidencia de consulta normal. Sin embargo, puede hacer esto con el marco de agregación:

 db.so.aggregate( [ { $match: …your normal other query… }, { $match: { $eq: [ '$modified', '$sync' ] } } ] ); 

Pongo … tu otra consulta normal … allí, ya que puedes hacer que ese bit use el índice. Entonces, si desea hacer esto solo para documentos donde el campo de name es charles , puede hacerlo:

 db.so.ensureIndex( { name: 1 } ); db.so.aggregate( [ { $match: { name: 'charles' } }, { $project: { modified: 1, sync: 1, name: 1, eq: { $cond: [ { $gt: [ '$modified', '$sync' ] }, 1, 0 ] } } }, { $match: { eq: 1 } } ] ); 

Con la entrada:

 { "_id" : ObjectId("520276459bf0f0f3a6e4589c"), "modified" : 73845345, "sync" : 73234 } { "_id" : ObjectId("5202764f9bf0f0f3a6e4589d"), "modified" : 4, "sync" : 4 } { "_id" : ObjectId("5202765b9bf0f0f3a6e4589e"), "modified" : 4, "sync" : 4, "name" : "charles" } { "_id" : ObjectId("5202765e9bf0f0f3a6e4589f"), "modified" : 4, "sync" : 45, "name" : "charles" } { "_id" : ObjectId("520276949bf0f0f3a6e458a1"), "modified" : 46, "sync" : 45, "name" : "charles" } 

Esto devuelve:

 { "result" : [ { "_id" : ObjectId("520276949bf0f0f3a6e458a1"), "modified" : 46, "sync" : 45, "name" : "charles", "eq" : 1 } ], "ok" : 1 } 

Si desea más campos, debe agregarlos en el $project .

Simplemente

 db.collection.find({$where:"this.modified>this.sync"}) 

Ejemplo

 Kobkrits-MacBook-Pro-2:~ kobkrit$ mongo MongoDB shell version: 3.2.3 connecting to: test > db.time.insert({d1:new Date(), d2: new Date(new Date().getTime()+10000)}) WriteResult({ "nInserted" : 1 }) > db.time.find() { "_id" : ObjectId("577a619493653ac93093883f"), "d1" : ISODate("2016-07-04T13:16:04.167Z"), "d2" : ISODate("2016-07-04T13:16:14.167Z") } > db.time.find({$where:"this.d1 db.time.find({$where:"this.d1>this.d2"}) > db.time.find({$where:"this.d1==this.d2"}) > 

Para MongoDB 3.6 y más reciente:

El operador $expr permite el uso de expresiones de agregación dentro del lenguaje de consulta, por lo que puede hacer lo siguiente:

 db.test.find({ "$expr": { "$gt": ["$modified", "$sync"] } }) 

o usando el marco de agregación con el pipeline de $match

 db.test.aggregate([ { "$match": { "$expr": { "$gt": ["$modified", "$sync"] } } } ]) 

Para MongoDB 3.0+:

También puede usar el marco de agregación con el operador de la tubería $redact que le permite procesar la condición lógica con el operador $cond y usa las operaciones especiales $$KEEP para “mantener” el documento donde la condición lógica es verdadera o $$PRUNE para “eliminar” el documento donde la condición era falsa.

Considere ejecutar la siguiente operación agregada que demuestra el concepto anterior:

 db.test.aggregate([ { "$redact": { "$cond": [ { "$gt": ["$modified", "$sync"] }, "$$KEEP", "$$PRUNE" ] } } ]) 

Esta operación es similar a tener una canalización de $project que selecciona los campos de la colección y crea un nuevo campo que contiene el resultado de la consulta de condición lógica y luego una $match posterior, excepto que $redact utiliza una etapa de canalización simple que es más eficiente:

Usa Javascript, usa foreach y convierte Date To toDateString ()

 db.ledgers.find({}).forEach(function(item){ if(item.fromdate.toDateString() == item.todate.toDateString()) { printjson(item) } }) 

En este momento, su consulta está intentando devolver todos los resultados, de modo que el campo modified sea ​​mayor que la palabra 'sync' . Intenta deshacerte de las citas relacionadas con la sync y ver si eso corrige algo. De lo contrario, hice una pequeña investigación y encontré esta pregunta . Es posible que lo que esté tratando de hacer no sea posible en una sola consulta, pero debería poder manipular sus datos una vez que saque todo de la base de datos.

Para solucionar este problema sin agregación, cambie su consulta a esto: {'modified': { $gt : ISODate(this.sync) }}