Когда я делаю POST, данные не сохраняются в MongoDB, только _ID сохраняется - PullRequest
1 голос
/ 06 апреля 2019

Я хотел сохранить данные в MongoDB.Я использую открытую схему (без ограничений).Если я делаю POST-запрос, сохраняется только _ID.Я не получаю ошибок, но данные, которые я передаю, игнорируются.

Я новичок в мангусте.Я читаю документы, но не могу точно определить, где я делаю ошибку.

моя схема:

var Schema = mongoose.Schema;
var product = new Schema({any: {}});
var Product = mongoose.model('Product',product)

мой запрос POST:

app.post('/input',function(request,response) {
    var product = new Product(request.body);    
    product.save(function(err,saved) {
        if (err) {
            response.send({error:"could not save"});
        } else  {
            response.send(saved);
        }
    })
})

Что получает сохранение вMongoDB:

{
    "_id": "5ca8c6ada7827b6f64c603bf",
    "__v": 0
}

Мой ввод:

{
    "name":"xmen",
    "age":25
}

Пожалуйста, дайте мне знать, если требуются какие-либо другие данные.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Вы испытываете это, потому что ваша схема Mongoose не знает о свойствах, которые она должна хранить в документе.

Вы использовали any в качестве ключа в своем определении схемы, что, как я полагаю, вы сделали, потому чтоВы следовали разделу SchemaTypes в документации.

any не означает, что какое-либо свойство является приемлемым.Это означает, что Mongoose ищет значение с ключом "any" , буквально.Если тело вашего запроса не содержит такого ключа (и не содержит его, поскольку оно содержит только name и age ), оно не будет поднято при сохранении нового объекта.

То, что вы испытываете, - это ожидаемое поведение Mongoose.

Определение схемы

MongoDB обладает гибкими структурами документов.Однако, когда вы определяете новую схему, вы также должны определить все возможные свойства и их типы (вы также можете использовать {} в качестве типа для поддержки любого типа - хотя это не рекомендуется).

Вы можете определитьваша схема выглядит следующим образом:

{
    name: String,
    age: Number
}

Это означает, что когда вы вызываете .save() для вашего нового объекта, Mongoose выберет только указанные свойства в схеме (а также _id и __v,которые существуют в любой схеме по умолчанию).


Подробнее о схемах Mongoose здесь .

0 голосов
/ 06 апреля 2019

Вы передаете request.body своему конструктору. request.body в вашем коде - это объект с двумя свойствами: name: "xmen" и age: 25. Однако ваш Schema содержит только одно свойство: any: {} ({} означает, что вы принимаете любой тип данных). когда вы передаете request.body в var product = new Product(request.body);, вы передаете объект с 2 свойствами в конструктор, который ожидает объект с одним свойством с именем any, поэтому, когда конструктор не находит, он возвращает объект только с _id. если вы предоставите:

  { any:"xmen"}

или

  {
    any: {
      "name":"xmen",
      "age":25
    }
  }

вы получите ожидаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...