Как использовать Mongoose без определения схемы?

118

В предыдущих версиях Mongoose (для node.js) была возможность использовать его без определения схемы.

var collection = mongoose.noSchema(db, "User");

Но в текущей версии функция "noSchema" была удалена. Мои схемы, вероятно, будут часто меняться и действительно не вписываются в определенную схему, так что есть ли новый способ использовать модели без схемы в мангусте?

Кристофер Тарквини
источник
3
просто используйте Mongodb plain, по умолчанию
эта
А как насчет метода сбора экземпляра createConnection ()?
Арнав Сингх

Ответы:

175

Я думаю, это то, что вы ищете Mongoose Strict

вариант: строгий

Параметр strict (включен по умолчанию) гарантирует, что значения, добавленные к нашему экземпляру модели, которые не были указаны в нашей схеме, не будут сохранены в db.

Примечание. Не устанавливайте значение false, если у вас нет веской причины.

    var thingSchema = new Schema({..}, { strict: false });
    var Thing = mongoose.model('Thing', thingSchema);
    var thing = new Thing({ iAmNotInTheSchema: true });
    thing.save() // iAmNotInTheSchema is now saved to the db!!
Джонатан П. Диас
источник
2
Ты спас мне день. Я также выяснил, что это не должно использоваться с #markMotified ('<columnName>')
allenhwkim
6
PS: Вы должны это сделать, thing.set(key, value)потому thing.key=valueчто не работает с этим методом, то есть в противном случае он не сохраняется в базе данных.
laggingreflex
4
Если вы воспользуетесь этим методом, вы столкнетесь с проблемами при получении документов. После выполнения поиска, а затем doc.someProp doc.someProp будет undefined, даже если он действительно присутствует на объекте (console.log подтверждает это), это потому, что мангуст определяет свои собственные геттеры, которые, похоже, работают только в том случае, если вы определяете та опора на схеме
Мельбурн
1
@ a20: Я понимаю, о чем вы говорите MySQL:) И я думаю, что предложение Джонатана / согласно документации API Mongoose Примечание. Не устанавливайте значение false, если у вас нет веской причины . Абсолютно нормально с текущим контекстом (только примерно NO-SQL)
Amol M Kulkarni
2
@ Melbourne2991 в некоторой степени это правда, однако я нашел обходной путь. Вы можете вызвать метод toJSON () для полученного документа, который затем позволит вам использовать обычную точечную нотацию, например doc.someProp. Извините, что ответил на такой старый ответ. Просто хотел добавить это на случай, если кто-то столкнется с тем же. https://mongoosejs.com/docs/guide.html#toJSON
Крис
60

На самом деле Schema.Types.Mixedрежим "Mixed" ( ) делает именно это в Mongoose ...

он принимает объект JS без схемы и произвольной формы - так что все, что вы можете на него бросить. Кажется, вам нужно будет вручную запускать сохранение этого объекта вручную, но это кажется справедливым компромиссом.

смешанный

SchemaType "все идет", его гибкость достигается за счет того, что его труднее поддерживать. Смешанный доступен либо через, Schema.Types.Mixedлибо путем передачи пустого литерала объекта. Следующие варианты эквивалентны:

var Any = new Schema({ any: {} });
var Any = new Schema({ any: Schema.Types.Mixed });

Поскольку это тип без схемы, вы можете изменить значение на любое другое, но Mongoose теряет возможность автоматически обнаруживать и сохранять эти изменения. Чтобы «сообщить» Mongoose об изменении значения смешанного типа, вызовите .markModified(path)метод документа, передавая путь к смешанному типу, который вы только что изменили.

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved
kwhitley
источник
Это все еще правильный способ работы без схемы с Mongo / Mongoose?
a20
5
Но эта структура вкладывает весь объект в anyполе, поэтому на самом деле у нее есть схема. Лучшим ответом на OP является использование, strict: falseкак говорится
Steampowe
16

Привет, Крис, взгляни на Монгоуса . У меня была такая же проблема с мангустом, так как мои схемы очень часто меняются прямо сейчас в разработке. Mongous позволил мне получить простоту Mongoose, в то же время имея возможность свободно определять и изменять мои «схемы». Я решил просто создать стандартные объекты JavaScript и хранить их в базе данных вот так

function User(user){
  this.name = user.name
, this.age = user.age
}

app.post('save/user', function(req,res,next){
  var u = new User(req.body)
  db('mydb.users').save(u)
  res.send(200)
  // that's it! You've saved a user
});

Гораздо проще, чем Mongoose, хотя я считаю, что вы упускаете некоторые интересные вещи промежуточного программного обеспечения, такие как pre. Но мне это не нужно. Надеюсь это поможет!!!

Hacknightly
источник
1
Знаете ли вы, как случайно исправить ошибки в mongous ? Этого несколько не хватает в документации.
Эрик Айгнер,
4
Я не считаю это настоящим ответом на вопрос, @kwhitley имеет соответствующий ответ относительно Mongoose.
janex
Я должен был бы согласиться. Однако я не уверен, что Schema.types.mixed был доступен на момент, когда OP задавал этот вопрос
Hacknightly
ОП здесь, я склонен согласиться с вами, однако ответ пришел через год после того, как я уже принял это.
Кристофер Тарквини
1

Вот подробное описание: [ https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.html provided [1 ]

    const express = require('express')()
    const mongoose = require('mongoose')
    const bodyParser = require('body-parser')
    const Schema = mongoose.Schema

    express.post('/', async (req, res) => {
        // strict false will allow you to save document which is coming from the req.body
        const testCollectionSchema = new Schema({}, { strict: false })
        const TestCollection = mongoose.model('test_collection', testCollectionSchema)
        let body = req.body
        const testCollectionData = new TestCollection(body)
        await testCollectionData.save()
        return res.send({
            "msg": "Data Saved Successfully"
        })
    })


  [1]: https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.html
Випул Панчал
источник