Ответы пользователя по тегу MongoDB
  • Как в MongoDB сделать push в масив если запись существует, а если нет создать новую?

    boratsagdiev
    @boratsagdiev
    Нужно смотреть на опцию upsert. Вот рабочий пример для задачи выше:

    db.users.updateOne(
      {
        userName: "username1",
        someAdditionalID: 12345,
      },
      {
        $push: {
          userDataArray: {
            name: "updated name",
            description: "updated desc",
          },
        },
        $setOnInsert: {
          userName: "new username",
          someAdditionalId: 478326,
        },
      },
      {
        upsert: true,
      }
    );


    В случае если по запросу ничего не найдено, то создастся новый документ, это регулируется опцией upsert: true. Если документ найден, то в массив запушится новый объект.

    Поля для нового документа можно задать в $setOnInsert.

    Достичь такого результата можно разными методами, вот например ещё варианты: https://www.baeldung.com/mongodb-upsert
    Ответ написан
    Комментировать
  • MongoDB - почему Users.findOne у меня undefined?

    boratsagdiev
    @boratsagdiev
    Потому что Users.findOne это асинхронный метод и результат надо вывести в callback или promise?

    var sameLogins = Users.findOne({ login: "a" }, (err, user) => {
      if (err) console.log(err);
    
      console.log(user);
    });


    С промисами:
    var sameLogins = Users.findOne({ login: "a" })
      .then(user => console.log(user))
      .catch(err => console.log(err));
    Ответ написан
  • Как корректно вывести время из MongoDB?

    boratsagdiev
    @boratsagdiev
    Может это?
    https://docs.mongodb.com/manual/reference/method/Date/


    Return Date as Date Object

    The mongo shell wrap objects of Date type with the ISODate helper; however, the objects remain of type Date.

    The following example uses new Date() to return Date object with the specified UTC datetime.

    var myDate = new Date("2016-05-18T16:00:00Z");


    moment.js'ом можете обработать даты после получения из базы, смотря вообще где вам нужно эти корректные даты отобразить. Можно и на клиенте.
    Ответ написан
  • Как вивести запрос к бд на страницу?

    boratsagdiev
    @boratsagdiev
    app.get('/', function(request, response) {
        response.render('pages/index', { regions: regionsController.getAll() });
    });


    Но учитывая что там в контроллере асинхронное получение данных из БД, то скорее всего ничего не выйдет и так. Сначала нужно получить данные из regionsController.getAll(), а потом уже внутри при полученных данных вызвать res.render.

    Или просто вынести response.render() в контроллер и его из роута вызывать.

    let regionsModel = require('../models/regions');
    
    exports.getAll = function(request, response) {
    regionsModel.getAll(function(error, docs) {
        if (error) {
            console.log(error);
            return response.sendStatus(500);
    }
    
        response.render('pages/index', { regions: docs });
    });
    };


    const controller = require('./controller');
    
    app.get('/', function(request, response) {
        controller.getAll(request, response);
    });


    Как-то так вроде.
    Ответ написан