【问题标题】:mongoose subdocument array not saving the entire object?猫鼬子文档数组不保存整个对象?
【发布时间】:2020-07-27 16:17:46
【问题描述】:

这是我的问题,我有两个模式,一个嵌套在另一个数组中。我试图推入数组并保存子文档,但它没有正确保存,我得到一个已保存的对象,但除了它的 _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);

这是我用来推送到联系人数组的代码。

 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 }
    );
  }

但是,当我检查我的数据库时,我看到的是这个。有一个 objectId 但不是我期望看到的,它是我的“大”文档中的联系人子文档列表

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

【问题讨论】:

  • 如果有人在看这个问题,我怎样才能让这个问题更清楚

标签: javascript node.js mongodb express mongoose


【解决方案1】:
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 成为一个联系人ID 数组,因此您不会复制任何数据,而只是引用他们集合中的联系人。 docs

【讨论】:

  • 天哪,我以为我已经尝试过了好几个小时,你是一个救世主!!!!!!
  • 也感谢您提供更新的答案,这让我有几个选择去哪里使用我以前不知道的代码! :D
  • @nuxer 是的,当同一个文档有自己的集合时,存储子文档通常不是一个好习惯。因为当您复制这样的数据时,您现在必须确保在所有位置更新文档。使用参考时,您只需更新主集合中的一个联系人。
猜你喜欢
  • 2017-12-05
  • 2018-07-12
  • 2021-01-30
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多