mon goose массив вложенных документов не сохраняет весь объект? - PullRequest
0 голосов
/ 14 апреля 2020

Вот моя проблема. У меня есть две схемы, одна вложенная в другую в виде массива. Я пытаюсь вставить sh в массив и сохранить вложенный документ, но он не сохраняется должным образом, я получаю объект, который сохраняется, но ни одно из полей не сохраняется, за исключением его _id. Нужно ли сначала сохранять каждую модель отдельно? В чем здесь проблема?

Вот мои две схемы:

import mongoose from "mongoose";
import {contactSchema} from "./ContactSchema"

export const bigSchema = new mongoose.Schema({
  testField: {
    type: String,
    required: true,
  },
  contacts: [{ contactSchema }],
  }
});

export default mongoose.model("Big", bigSchema);

import mongoose from "mongoose";

export const contactSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  age: {
    type: number,
    required: false,
  }
});

export default mongoose.model("Contact", contactSchema);

Вот мой код, который я использую для pu sh для массива контактов.

 public async saveContact(
    testField: string,
    name: string,
    age: number,
  ) {
    const newContact = new Contact({
      name: name,
      age: age,
    });

    console.log(newContact);
    return UserContacts.findOneAndUpdate(
      {
        testField: testField,
      },
      { $push: { contacts: newContact } },
      { new: true, upsert: true }
    );
  }

Однако, когда я проверяю свою базу данных, я вижу именно это. Существует объектный идентификатор, но не тот, который я ожидаю увидеть, который представляет собой список вложенных документов «Контакт» внутри моего «большого» документа

{
    "_id" : ObjectId("XXXX"),
    "testField" : "XXXXX",
    "contacts" : [ 
        {
            "_id" : ObjectId("XXXXX")
        }
    ],
    "__v" : 0
}

1 Ответ

1 голос
/ 14 апреля 2020
export const bigSchema = new mongoose.Schema({
  testField: {
    type: String,
    required: true,
  },
  contacts: [{ contactSchema }],
  }
});

должно быть:

export const bigSchema = new mongoose.Schema({
  testField: {
    type: String,
    required: true,
  },
  contacts: [contactSchema],
  }
});

Попробуйте и посмотрите, что произойдет.

Редактировать: Кроме того, если вы намереваетесь, чтобы contacts был массивом ссылок на Contact модель, тогда вам нужно сделать это вместо:

export const bigSchema = new mongoose.Schema({
  testField: {
    type: String,
    required: true,
  },
  contacts: [{type: mongoose.Schema.Types.ObjectId, ref: 'Contact'}],
  }
});}

Это сделает contacts массивом идентификаторов контактов, так что вы не будете дублировать какие-либо данные, а просто будете ссылаться на контакты в их коллекция. * документы 1014 *

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