Ответы пользователя по тегу Mongoose
  • MongoDB: копятся активные подключения, что делать?

    @Abcdefgk
    Реквайрить mongoose в этот файл (безо всяких выкрутасов) и написать mongoose.disconnect() в конце.
    Ответ написан
    Комментировать
  • В чем отличие при обращении к коллекции then() или .exec()?

    @Abcdefgk
    Либо то, либо другое. И то, и другое - можно, но бессмысленно.
    В exec() передаётся два аргумента - ошибка и данные (вернее, данные в аргумент callback-функции), в then() - один, естественно, только данные (точнее, данные в аргумент resolve).
    Then - это использование промиса. Это значит, что можно - как обычно с Promise - делать return результата (т.е. передавать его в следующий then), а потом ещё раз then, и ещё раз... - ну, если надо такое. А в общем случае - без разницы.
    Ответ написан
    Комментировать
  • Как из одной схемы сослаться на вторую?

    @Abcdefgk
    const Schema = mongoose.Schema; //так просто удобнее
    
    const brandSchema = new Schema ({
      name: String,
      image: String
    });
    
    const productSchema = new Schema ({
      name: String,
      image: String,
      brand: { type: Schema.Types.ObjectId, ref: 'Brand' } // этот ref ссылается на имя модели, которое будет ниже
    });


    var Brand = mongoose.model('Brand', brandSchema); // вот оно, это имя в казычках
    var Product = mongoose.model('Product', productSchema);

    Теперь во время сохранения документа с продуктом ему в поле brand надо передавать id брэнда, к которому он относиться.

    var briony = new Brand({
      name: "Briony",
      image: ".../briony.jpg"
    });
    var shapka = new Product({
      name: "Shapka",
      image: "...../shapka.jpg",
      brand: briony // тут id брэнда этой шапки (как показал чувак в том ответе - и я проверял - mongoose сам сообразит именно id брэнда вписать по переменной briony, но можно и явно - briony._id)
    });
    briony.save();
    shapka.save();

    Только это бессмысленное использование populate. Его смысл заключается в том, чтобы не передавать в документ много информации о соотносимом с ним документом - когда этой информации там действительно много. А тут только две строчки: имя и ссылка на логотип.
    Смысл могло бы иметь обратное действие. Добавляем в схему брэндов поле:
    const brandSchema = new Schema ({
      name: String,
      image: String,
      products: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
    });

    И сохранив в базу документ shapka, здесь же делаем push её айдишника в массив продуктов от Briony:
    var briony = new Brand({
      name: "Briony",
      image: ".../briony.jpg"
    });
    briony.products.push(shapka._id);

    Вот теперь в поле products документ с именем Briony будет иметь не массив больших объектов с названиями продуктов, их описанием, ценой и т.д., а массив только айдишников продуктов, к этому брэнду относящихся.
    И наоборот. Если схема брэнда предполагает не только его имя и картинку, а и ещё какое-то описание, длинную историю и т.д., то это всё не надо вписывать в документ продукта, а вписать только id бренда, а всю эту подробную муть запрашивать во время запроса документа shapka с помощью как раз populate:
    Product
      .findOne({ name: 'Shapka' })
      .populate('brand') // это означает "заселить", т.е. по айдишнику, вписанному в поле brand продукта, найти в коллекции брендов - нужный брэнд и вывалить сюда всю о нём информацию
      .exec ... // и т.д.

    Или
    Product
      .findOne({ name: 'Shapka' })
      .populate('brand', 'image')
      .exec ... // и т.д.

    если от бренда нужна только его картинка нопремер.
    (или только его имя - .populate('brand', 'name')

    Как-то так.
    Ответ написан
    2 комментария
  • Где лучше создать директорию для БД в MongoDB?

    @Abcdefgk
    Тут всё просто. Базу нужно преспокойно установить на D:\
    И даже если потом отформатировать C:\ и установить новую систему - Монгу даже переустанавливать не придётся, она останется там в рабочем состоянии.
    Ответ написан
  • Как правильно сохранить модель в MongoDB?

    @Abcdefgk
    new Game({
        timeCreated: Date.now()
    }).save();
    Ответ написан
    Комментировать