Невозможно вернуть _id вложенного документа с помощью mongoosejs

[
{
    "_id": "58b89de6a480ce48c8f3742d",
    "name": "Core Site",
    "version": "1.0.0",
    "author": "Jane Doe",
    "vendor": "Online Banking",
    "steps": [
        {
            "name": "Step 1: Fun Stuff",
            "dependencies": "1,2,3,4",
            "resource": "TS",
            "weight": 0
        },
        {
            "name": "Step 2: Weird Stuff",
            "dependencies": "3,4",
            "resource": "PS",
            "weight": 1
        }
    ]
},
{
    "_id": "58b8a22097fbe41746827ac7",
    "name": "Online Statements",
    "version": "1.0.0",
    "author": "John Doe",
    "vendor": "Online Banking",
    "steps": [
        {
            "name": "Step 1: Fun Stuff",
            "dependencies": "1,2,3,4",
            "resource": "TS",
            "weight": 0
        }
    ]
}]

Я сохранил эту информацию в MongoDB, но когда я пытаюсь получить эту информацию, поддокумент «Шаги» не включает _id, который я вижу с помощью Robomongo.

Моя схема выглядит следующим образом:

    // grab the things we need
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var stepSchema = new Schema({
  name: { type: String, required: true},
  dependencies: String,
  resource: String,
  weight: Number
})

// create a schema
var sopSchema = new Schema({
  name: { type: String, required: true, unique: true },
  version: String,
  author: String,
  vendor: String,
  steps: [stepSchema]
});



// the schema is useless so far
// we need to create a model using it
var Sop = mongoose.model('Sop', sopSchema);

// make this available to our users in our Node applications
module.exports = Sop;

Моя конечная цель — проверить, включен ли уже этот шаг, и обновить его при внесении изменений во внешний интерфейс. Поэтому я хотел получить эту ссылку, чтобы убедиться, что у меня есть правильный поддокумент.

Мой оператор get выглядит следующим образом на моем сервере nodejs.

router.route('/sops')
    .get(function(req, res) {
        Sop.find(function(err, sops) {
            if (err)
                res.send(err);

                var subdoc = sops[0].steps[0];
                console.log(subdoc);
            res.json(sops);
    });
})

person Ben Gummelt    schedule 18.03.2017    source источник
comment
Как angular2 влияет на этот пост. ?? Удаляем, так как здесь не используется   -  person Aravind    schedule 18.03.2017
comment
Спасибо. Я использовал остальную конечную точку с помощью angular2 и не захватывал _id, но обнаружил, что это неправильно с самим возвратом. Извиняюсь   -  person Ben Gummelt    schedule 18.03.2017
comment
в чем проблема, с которой вы столкнулись?   -  person Aravind    schedule 18.03.2017
comment
Я пытаюсь создать реактивную форму, которая может добавить несколько шагов к SOP. Основная проблема, с которой я сталкиваюсь, заключается в том, как я могу обновить шаг, если он немного изменен, не очищая все шаги и просто обновляя их как новые шаги. Мой первый подход — получить _id, чтобы я мог передать его и выполнить цикл For, чтобы определить, что изменилось. Но если я смогу найти, что изменилось в форме, и просто отправить это, это, вероятно, тоже сработает.   -  person Ben Gummelt    schedule 18.03.2017


Ответы (2)


MongoDB не будет добавлять _id во вложенные документы за вас. Вам нужно добавить его вручную.

So:

"steps": [
        {
            "_id": new ObjectId(),
            "name": "Step 1: Fun Stuff",
            "dependencies": "1,2,3,4",
            "resource": "TS",
            "weight": 0
        }
 ]
person hya    schedule 18.03.2017
comment
Когда я использую Robomongo, я вижу _id в БД. Не уверен, почему это не происходит. Я могу попробовать добавить объект, просто чтобы посмотреть. - person Ben Gummelt; 19.03.2017

Ссылка на статью, в которой устранена проблема

  var stepSchema = new Schema({
  name: { type: String, required: true},
  dependencies: String,
  resource: String,
  weight: Number
},{ _id: true });

В конец добавлен атрибут _id: true, чтобы принудительно сгенерировать _id.

person Ben Gummelt    schedule 18.03.2017