node-mongo-native和mongo-shell在给定相同查询的情况下返回不同的结果

时间:2017-02-28 15:50:49

标签: node.js mongodb mongoose mongodb-query

给出下一个代码:

  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);
      });
  });

我得到了下一个console.log结果。如您所见,结果是一个空数组:

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

如果我对mongo-shell执行相同的查询,则返回一个文档:

即:

> 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" : "alalalalala@lalalalal.com" }, "__v" : 0, "deleted" : false, "answered" : true, "firstAnswerTime" : 15614529, "updated" : "2016-02-01T17:28:34.868Z"

为什么我从node-mongo-native启动的查询中没有得到任何结果?

我的node-mongo-native版本是2.2.24。

我已经开始使用mongoose但是切换到node-mongo-native来进行此查询,因为我认为这是mongoose的问题。顺便说一句,如果它有助于澄清它为什么不起作用,我会发布我的架构:

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);

1 个答案:

答案 0 :(得分:0)

在底层集合中,updated字段存储为字符串,在您的应用程序中,您将其查询为日期,除非您使用字符串在mongo shell中查询它,否则不会产生任何效果返回文档。

看到updated字段是一个字符串,请尝试将其作为一个字符串查询,即将查询变量更改为

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