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

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

    @Abcdefgk
    Вообще-то, до появления ловкой библиотеки async просто создавали переменную var count = 0 и плюсовали её в конце каждого колбека обращения к базе, после чего - в каждом колбеке - стояло условие (предположим, что обращений - пять штук) "если count == 5, то res.end(...)"
    Ответ отправлялся - когда все асинхронные работы завершены.
    (за это объяснение старинного механизма "борьбы с асинхронностью" меня когда-то навечно зобанели на русском Стековерфлоу)
    Ответ написан
    Комментировать
  • Как из одной схемы сослаться на вторую?

    @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
    Поле в коллекции, по которому искать, надо проиндексировать в базе как "text", а потом запросить с операторами .find( { $text: { $search: "bla-bla" } } )
    Ответ написан
    Комментировать
  • Как грамотно спроектировать MongoDB?

    @Abcdefgk
    В таких вложенных во вложения вложениях потом поиск по индексам не работает нопремер.
    Надо "проектировать" так, чтобы было меньше вложений, но были отсылающие поля. Всё отдельными коллекциями.
    Ну типа коллекция (модель) City
    {
    name: String,
    region: String,
    country: String
    }
    И потом, чтобы выбрать все города Чукотки, находящиеся в США, можно будет запросить просто:
    City
      .find()
      .where('region', 'Чукотка')
      .where('country', 'США')
      .exec(...
    Ответ написан
    2 комментария
  • Как правильно сохранить модель в MongoDB?

    @Abcdefgk
    new Game({
        timeCreated: Date.now()
    }).save();
    Ответ написан
    Комментировать
  • Почему не могу подключится к базе, используя логин:пасс созданного юзера?

    @Abcdefgk
    Где создал? Надо зайти (как админ) в искомую базу данных - типа use local-base - и, находясь в ней, написать всё то же самое.
    (если в конфиг-файле, вообще говоря, ещё разрешён вход "со стороны")
    Ответ написан