Nodejs Не удается найти документ при использовании метода .find ({}) - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь сделать простой .find (), используя mongoose / nodejs с mongoDB.У меня есть документ (с полем "дата": "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 ', которая является единственным документом, который находится в этой коллекции на данный момент.В конечном итоге в коллекции будет более одного документа.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2019

См. Также: https://stackoverflow.com/a/55386123/211827 - при запросе дат используйте фактические даты.При запросе ObjectIds используйте реальные ObjectIDS.И т.д. Потому что ваши строки в буквальном смысле являются наихудшим форматом даты для любой формы лексикографического ожидания .В частности: несоблюдение формы формата даты ISO наименее специфичной для наиболее конкретной (год, месяц, день) предотвратит любую форму сортировки, запроса диапазона или, по существу, любую из «самых полезных» вещей, которые вы можетеиспользуйте фактические даты для хранения в виде строк, что обычно не является подходящим форматом хранения дат.

"2019/09/21" = 11 байтов.Та же самая дата представлена ​​с использованием юлианского календаря: 2458748, или 32-разрядное целое число (4 байта), без компонента времени.Временная метка UNIX будет 64-битной, то есть 8 байтов, и вам также придется отбрасывать или игнорировать компонент времени внутри.Даже неправильный правильный путь лучше, чем неправильный.;)

0 голосов
/ 21 сентября 2019

Проверьте, указана ли ваша дата в дБ в формате iso date или iso string.
Если это дата iso, вам нужно будет сделать new Date(09-20-2019).
Если это iso строка, то вам также необходиморассмотрим часовой пояс.
Попробуйте найти, используя запрос между 09-20-2019 и 09-21-2019.
Вы должны получить данные.

0 голосов
/ 21 сентября 2019

Регистрация в вашей базе данных, в которой есть формат даты, например, «02/03/1995», это может быть с помощью сохранения, если вы меняете формат, если нет, то, пожалуйста, поделитесь одним объектом вашей схемы.

Это правильно работает в моей схеме.

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