使用 mongoose 一次将多个 ObjectId 插入子文档

Posted

技术标签:

【中文标题】使用 mongoose 一次将多个 ObjectId 插入子文档【英文标题】:Inserting multiple ObjectIds to sub-document at once with mongoose 【发布时间】:2020-12-26 23:53:23 【问题描述】:

我正在使用猫鼬,我有以下型号:

const UniversitySchema = new Schema(
    name: 
        type: String,
        required: [true, 'Name is required']
    ,
    color: 
        type: String
    ,
    paths: [
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Path'
    ]
)

我希望能够在第一次创建它时将多个路径(转换为路径模型)插入到大学集合中。我尝试了以下代码:

const newUni = new University(
    name: name,
    paths: [...pathIds],
    color: color
)

newUni.save()
    .then(uni => 
            return res.send(uni)
        )
    .catch(err => console.log(err)); 
    ) 

但它会引发此错误:

CastError: Cast to ObjectId failed for value "[ 5f122f9967c59932b44214b6, 5f2762858f9060327c4f6b2f ]" at path "_id" for model "Path"

 messageFormat: undefined,
  stringValue: '"[ 5f122f9967c59932b44214b6, 5f2762858f9060327c4f6b2f ]"',
  kind: 'ObjectId',
  value: [ 5f122f9967c59932b44214b6, 5f2762858f9060327c4f6b2f ],
  path: '_id',
  reason: Error: Argument passed in must be a single String of 12 bytes or a string 
of 24 hex characters

看起来mongoose在有多个ID时不会单独投射ID,因为当我尝试使用一个ID时,它起作用了。

我也尝试过保存文档,然后将 ids 推送到路径数组,但没有成功。

有没有办法一次性完成?

提前致谢。

【问题讨论】:

【参考方案1】:

您需要确保每个数组的id- 值中没有空格:

使用此代码

const newUni = new University(
    name,
    paths: ["5f122f9967c59932b44214b6","5f2762858f9060327c4f6b2f"],
    color
)

它肯定可以工作。

所以假设pathIds最初持有字符串" 5f122f9967c59932b44214b6, 5f2762858f9060327c4f6b2f ",你可以简单地做

...
paths: pathIds.split(",").map(v => v.trim()),
...

获取修剪后的id-values 数组:

【讨论】:

以上是关于使用 mongoose 一次将多个 ObjectId 插入子文档的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JQuery 一次将多个图像添加到 DOM?

是否可以在 C# winforms 中一次将文本写入多个文本框?

如何一次将多个整数传递给一个向量?

使用php一次将多个项目提交到贝宝购物车

如何在不使用游标的情况下一次将查询结果分配给多个变量?

有没有办法使用 Sequelize 一次将多个嵌入式模型保存在数据库中