【问题标题】:Nodejs Cannot find document when using .find({}) methodNodejs使用.find({})方法时找不到文档
【发布时间】:2020-01-22 01:49:04
【问题描述】:

我正在尝试使用 mongoose/nodejs 和 mongoDB 做一个简单的 .find()。我的收藏(显示)中有一个文档(字段为“日期”:“09-20-2019”),但我似乎无法以编程方式找到它。

我尝试使用 MongoDB 指南针(数据库查看器软件)来搜索我要查找的内容。我进入了我的收藏 {date: "09-20-2019"} 下的搜索框,我能够使用他们的搜索功能找到该文档,所以我知道它应该可以工作。我已检查“日期”字段是否作为“09-20-2019”的正确格式和值传递到后端节点服务器。我正在使用 Node.js 10.15.1

--This is from my route.js file
router.get('/shows/:date', (req, res, next)=>{
    //res.send('Retrieving the shows list');

    console.log('back end date: ' + req.params.date);

    Show.find({date: req.params.date}, function(err, result){
        if (err)
        {
            res.json(err);
        }
        else {
            console.log(result);
            res.json(result);
        }
    })
});
--This is from my show.js (mongodb schema file)
const mongoose = require('mongoose');

const ShowSchema = mongoose.Schema({
    name:{
        type: String,
        required: true
    },
    date:{
        type: String,
        required: true
    },
  venue:{
    type: String,
    required: true
  },
  createdDate:{
    type: String,
    required: true
  }
});

const Show = module.exports = mongoose.model('Show', ShowSchema);
--This is from my service.ts file
  getShow(date)
  {
    var headers = new Headers();
    headers.append('Content-Type', 'application/json');
    //date is in format MM/dd/yyyy (e.g. 09-20-2019)
    return this.http.get<Show>('http://localhost:3000/api/shows/' + date);
  }
--This is from my component
    this.commentCardService.getShow(this._date).subscribe(data => {
      console.log(data);
    });

我希望 .find({}) 操作返回我的 mongoDB 中的单个文档,该文档的日期为“09-20-2019”,这是该集合中目前唯一的文档.集合中最终会存在多个文档。

【问题讨论】:

  • 什么是集合名称?和Shows有区别吗?
  • 集合名称好像是 Shows。我第一次这样做时,我将新集合手动输入到 mongoDB 指南针中。看起来这可能是问题所在?现在我创建了一个 POST 端点来创建一个“显示”并让它自己创建集合。但是现在我不明白为什么当模式被称为“显示”时集合被称为“显示”?该命名约定从何而来? @SandeepPatel 谢谢
  • 第一个参数是您的模型所针对的集合的单数名称。 ** Mongoose 会自动查找您的型号名称的复数、小写版本。请阅读此mongoosejs.com/docs/models.html。如果要覆盖默认模型,可以将第三个参数作为集合名称传递。例如mongoose.model('ModelName', Schema,collectionName);

标签: node.js mongodb mongoose dao


【解决方案1】:

签入您的数据库,其中包含“02/03/1995”之类的日期格式,可以通过保存,如果没有,您正在更改格式,然后请分享您的架构对象。

这在我的架构中正常工作。

db.getCollection('users').find({dob:'02/03/1995'})

【讨论】:

  • 在“橡皮鸭调试”中,这是给我妈妈的(实际上,她非常容易地理解 ObjectId/datetime 转换问题),即使她意识到如果你对这些日期进行排序,你会得到 9 月的每个日期将每一年分组在一起,然后是每年 10 月的每个日期,然后…… 挑战这个日期字符串立即提出的问题:{高效,没有正则表达式}找到我 2019 年 1 月到 3 月之间的所有文档。祝你好运。 (对于大多数用途而言,它基本上是无用的,而且浪费存储,请参阅我的回答。)
【解决方案2】:

另请参阅:https://stackoverflow.com/a/55386123/211827 — 查询日期时,使用实际日期。查询 ObjectIds 时使用真实的 ObjectIds。等等。因为对于任何形式的lexicographical expectation,您的字符串实际上是最糟糕的日期格式。具体来说:不遵循最不具体到最具体(年、月、日)的ISO date format form 将阻止任何形式的排序、范围查询或基本上任何“最有用”的事情,您可以在存储为时使用实际日期字符串,通常不适合存储日期。

"2019/09/21" = 11 个字节。使用儒略历表示的同一日期:2458748,或 32 位整数(4 个字节),没有时间分量。 UNIX 时间戳将是 64 位,因此是 8 个字节,您还必须丢弃或忽略其中的时间组件。即使是错误的正确方式也比错误的错误方式要好。 ;)

【讨论】:

    【解决方案3】:

    检查您在 db 中的日期是 iso 日期还是 iso 字符串格式。
    如果它是一个 iso 日期,那么您将不得不这样做new Date(09-20-2019)
    如果它是一个 iso 字符串,那么您还需要考虑时区。
    尝试使用介于 09-20-2019 和 09-21-2019 之间的查询进行查找。
    你应该得到数据。

    【讨论】:

    • 09-20-2019 == -2030 == 1969 年 12 月 31 日星期三 18:59:57 UTC-0500 (EST)。所以给定的代码是非常错误的。此外,总是需要考虑时区。 以 UTC 存储和传输是最佳实践,因为“时区”(它本身并不是真正的时区)不受夏令时的影响(没有重复或丢失的时间),使得给定时间或日期,绝对且明确。
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2023-03-18
    • 2016-04-02
    相关资源
    最近更新 更多