Як ви використовуєте Mongoose без визначення схеми?


118

У попередніх версіях Mongoose (для node.js) була можливість використовувати його без визначення схеми

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

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


3
просто використовуйте звичайну Mongodb, ось схема за замовчуванням менше
Simon Dragsbæk

Відповіді:


175

Я думаю, що це те, що ти шукаєш Мангуст Стрикт

варіант: суворий

Сувора опція (увімкнена за замовчуванням) гарантує, що значення, додані до нашого екземпляра моделі, які не були визначені в нашій схемі, не будуть збережені в 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 ('<назва колони>')
allenhwkim

6
PS: Ви повинні робити, thing.set(key, value)тому thing.key=valueщо не працює з цим методом, тобто він не зберігається, змінився в базі даних інакше.
laggingreflex

4
Якщо ви використовуєте цей метод, у вас виникнуть проблеми під час отримання документів. Після того, як знайдете, а потім doc.someProp doc.someProp буде невизначено, навіть якщо він фактично є на об'єкті (консоль.log це підтверджує), це тому, що мангуст визначає власні геттери, які, здається, спрацьовують, лише якщо визначити що підтримує схему
Мельбурн2991

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) режим, як видається, робить саме це в Мангусті ...

він приймає об'єкт JS без схеми , вільний від форми, так що все, що ви можете кинути на нього. Здається, ви повинні вручну заощадити цей об’єкт вручну, але це здається справедливим компромісом.

Змішаний

Схема «що йде», її гнучкість приходить до компромісу, який важче підтримувати. Змішаний доступний через Schema.Types.Mixedабо через передачу порожнього об'єкта в буквальному сенсі. Наступні:

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

Оскільки це тип без схем, ви можете змінити значення на все, що вам більше подобається, але Mongoose втрачає здатність автоматично визначати та зберігати ці зміни. Щоб "сказати" Мангусту, що значення змішаного типу змінилося, викличте .markModified(path)метод документа, що передає шлях до змішаного типу, який ви щойно змінили.

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

Це все-таки правильний спосіб працювати без схем з Mongo / Mongoose?
a20

5
Але ця структура вкладає весь об'єкт під anyполе, тому насправді має схему. Краще відповідь на ЗР є використання в strict: falseякості говорить ця відповідь.
парі

16

Гей, Кріс, поглянь на Mongous . У мене виникло те саме питання з мангустом, оскільки мої схеми зараз дуже часто змінюються. Mongous дозволив мені мати простоту Мангуста, маючи змогу вільно визначити та змінити свої «схеми». Я вирішив просто створити стандартні об’єкти 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, хоча я вважаю, що ви пропустите деякі цікаві програмного забезпечення середнього програмного забезпечення, наприклад "до". Мені нічого цього не потрібно. Сподіваюся, це допомагає !!!


1
Чи знаєте ви, як випадково впоратися з помилками у mongous ? Цього дещо не вистачає в документах.
Ерік Айгнер

4
Я не вважаю це справжньою відповіддю на питання, але @kwhitley має відповідну відповідь щодо Мангуста.
janex

Я мав би погодитися. Я не впевнений, що Schema.types.mixed був доступний під час роботи ОП із запитанням
Hacknightly

ОП тут, я схильний погодитися з вами, проте відповідь надійшла через рік після того, як я вже прийняв цю.
Крістофер Таркіні

1

Ось детальний опис: [ https://www.meanstack.site/2020/01/save-data-to-mongodb-without-defining.html обвинений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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.