ObjectId автоматически генерируется для вложенного объекта? - PullRequest
0 голосов
/ 04 сентября 2018

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

const MessageType = {
   // ...
   oAuth: { provider: String, id: String },
   attachments: [ {name: String, contentType: String} ],
   // ...
}
MessageSchema = new mongoose.Schema(MessageType, { timestamps: true});
Messages = mongoose.model("Message", MessageSchema);

Когда я вставляю новый документ сообщения, используя Messages.create, ObjectId (_id) также генерируется для attachments, в дополнение к моим полям name и contentType, то есть:

[ { name: "xxx", contentType: "yyy", _id: zzzzzz }]

Почему это происходит, для attachments, но не oAuth?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Чтобы избежать создания _id, необходимо установить параметр _id: false . Также, если вы не хотите сохранять пустой объект вложения, вам нужно установить default: undefined .

const MessageTypeSchema = new  mongoose.Schema({
    oAuth: {
        type: String
    },
    attachments: {
        type: [
            {
                type: String
            }
        ],
        _id: false,
        default: undefined
    }
});

Вот код, который я использовал для проверки:

 console.log('-------- Document with attachments --------');
    new MessageTypeModel({
        oAuth:'xxxxxxxxxxxxx',
        attachments: ['teste.png','teste2.jpg']
    }).save().then(result => {
        console.log(result);
    });

    console.log('-------- Document without attachments --------');
    new MessageTypeModel({
        oAuth:'xxxxxxxxxxxxx'
    }).save().then(result => {
        console.log(result);
    });

А вот и результат выполнения:

test execution

Mongoose создает _id для отдельных вложенных вложенных документов или массивов , и поле вашего объекта oAuth не является одним из следующих случаев:

Субдокументы - это документы, встроенные в другие документы. В мангусте, это означает, что вы можете вкладывать схемы в другие схемы. Мангуст имеет два Отдельные понятия вложенных документов: массивы вложенных документов и отдельные вложенные вложенные документы.

Каждый вложенный документ по умолчанию имеет _id. Мангуста массивы документов имеют специальный метод идентификатора для поиска документа массив для поиска документа с заданным _id.

var childSchema = new Schema({ name: 'string' });

var parentSchema = new Schema({
  // Array of subdocuments
  children: [childSchema],
  // Single nested subdocuments. Caveat: single nested subdocs only work
  // in mongoose >= 4.2.0
  child: childSchema
});

Ссылка на документацию Mongoose: Субдокументы Mongoose

0 голосов
/ 04 сентября 2018

Вы можете определить _id : false в массиве вложений.

const MessageType = {
   // ...
   attachments: [ {name: String, contentType: String, _id: false} ],
   // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...