2017-02-28 3 views
2

den nächsten Code Gegeben gegeben:Knoten-Mongo-native und Mongo-Shell liefern unterschiedliche Ergebnisse die gleiche Abfrage

var daysToBeOld = 7; 
    var dateOlder = moment().subtract(daysToBeOld, 'days').toDate(); 

    MongoClient.connect(mongouri, function(err, db) { 

    console.log('Filtering pending topics before: %s', dateOlder); 

    var conditions = {status: 'pending', updated: {$lt: dateOlder}}; 

    console.log('Using the next filters: %j', conditions); 

    var topicsCol = db.collection('topics'); 

    topicsCol.find(conditions).toArray(function (err, topics) { 
     if (err) { 
      console.log(err); 
     } 

     console.log("found %j topics", topics); 

     callback(err, topics); 
     }); 
    }); 

ich die nächsten console.log Ergebnisse. Wie Sie das Ergebnis sehen kann, ist ein leeres Array:

Filtering pending topics before: Tue Feb 21 2017 15:13:35 GMT+0000 (UTC) 
Using the next filters: {"status":"pending","updated":{"$lt":"2017-02-21T15:13:35.191Z"}} 
found [] topics 

Wenn ich die gleiche Abfrage ausführen Mongo-shell es gibt ein Dokument:

Ie:

> db.topics.find({"status":"pending","updated":{"$lt":"2017-02-21T15:13:35.191Z"}}) 
{ "_id" : "076bbbc0-e318-11e6-9375-e94b488c7ad8", "status" : "pending", "text" : "lalalalalla", "topicType" : "Información", "member" : "NoUsuarioForus", "service" : "Limpieza", "idCard" : "", "receiveAnswer" : "1", "toc" : "1", "date" : ISODate("2016-08-31T16:36:45Z"), "sender" : { "name" : "alalalal", "email" : "[email protected]" }, "__v" : 0, "deleted" : false, "answered" : true, "firstAnswerTime" : 15614529, "updated" : "2016-02-01T17:28:34.868Z" 

Warum ich bin Erhalten keine Ergebnisse in der Abfrage von Node-Mongo-native gestartet?

Meine node-mongo-native Version ist 2.2.24.

Ich habe begonnen, Mungo zu verwenden, aber wechselte zu Node-Mongo-native, um diese Abfrage zu machen, weil ich dachte, dass das ein Problem mit Mungo war. Ich werde mein Schema schreiben Btw, wenn es klären hilft, warum es nicht funktioniert:

topic.js:

var mongoose   = require('mongoose'); 
var mongoosePaginate = require('mongoose-paginate'); 
var Schema   = mongoose.Schema; 
var uuid    = require('node-uuid'); 
var xss    = require('xss'); 

var TopicSchema = new Schema({ 
    _id: { 
    type: String, 
    default: uuid.v1 
    }, 
    status: { 
    type: String, 
    // open: When the message is created first time or not exists 
    // pending: The issue has been answered by some employee. Waiting for answer from the customer 
    // closed: The issue has been resolved 
    enum: ['open', 'closed', 'pending'] 
    }, 
    sender: { 
    name: String, 
    email: { 
     type: String, 
     required: true, 
    } 
    }, 
    text: { 
    type: String, 
    required: true 
    }, 
    date: { 
    type: Date, 
    default: Date.now 
    }, 
    updated: { 
    type: Date 
    }, 
    // If the topic is answered by an user different than creator it will be true 
    answered: { 
    type: Boolean, 
    default: false 
    }, 
    firstAnswerTime: Number, 
    centerId: String, 
    topicType: String, 
    member: String, 
    service: String, 
    idCard: String, 
    receiveAnswer: String, 
    toc: String, 
    satisfaction: Number, 
    deleted: { 
    type: Boolean, 
    default: false 
    } 
}); 

TopicSchema.plugin(mongoosePaginate); 

TopicSchema.pre('save', function(next) { 
    this.updated = new Date(); 
    this.text = xss(this.text); 
    next(); 
}); 

module.exports = mongoose.model('Topic', TopicSchema); 
+0

Ich habe mein Modell Mungo definiert. Ich werde die Frage aktualisieren. – Genar

+1

'aktualisierten' Feld ist ein String und in Ihrer Anwendung werden Sie es als ein Datum abfragen, die nichts ergeben wird, aber wenn Sie es in Mongo Shell unter Verwendung einer Zeichenfolge abfragen, wird das Dokument korrekt zurückgegeben. – chridam

+1

Wenn Sie sehen, dass das "aktualisierte" Feld eine Zeichenkette ist, haben Sie versucht, es als eine Variable abzufragen, d. H. Die Variable in 'var dateOlder = moment() ändern. Subtract (daysToBeOld, 'days'). ToISoString()'? – chridam

Antwort

0

In der zugrunde liegenden Auflistung wird updated Feld als String gespeichert und in der Anwendung Sie fragen es als Datum ab, das nichts bringt, aber wenn Sie es in der Mongo-Shell mit einem String abfragen, gibt es das Dokument korrekt zurück.

Sehen, dass updated Feld ein String ist, versuchen Sie es als eine Abfrage das heißt Ändern der Abfragevariable zu

var dateOlder = moment().subtract(daysToBeOld, 'days').toISOString(); 
Verwandte Themen