gpt4 book ai didi

javascript - 模型之间的 Mongoose 关系

转载 作者:行者123 更新时间:2023-12-02 18:23:47 26 4
gpt4 key购买 nike

我正在使用 mongoose,并且有两个模型:Item 和 Hashtag。
主题标签模型应仅包含名称,项目模型应包含主题标签列表(由​​ ids 表示)。
这就是我所做的:

var ItemSchema = new Schema({
hashtags: [ { type: Schema.ObjectId, 'default': null, ref: 'Hashtag' } ],
});

var HashtagSchema = new Schema({
name: { type: String, 'default': '', trim: true },
items: [{ type: Schema.ObjectId, ref: 'Page' }]
});

这就是我尝试创建项目的方式:

   var item = new Item({
hashtags: ['a', 'b', 'c']
});
item.save(function (err, item) {
if (err) return res.json({ error: err });
res.json(item);
});

不幸的是我收到这个错误:

CastError: Cast to ObjectId failed for value "a,b,c" at path "hashtags"

我该如何解决这个问题?

最佳答案

由于您正在使用 references而不是subdocuments ,您需要首先创建主题标签对象:

var tagnames = ['a','b','c'];
var hashtags = {}; //for referencing quickly by name later
for (var h in tagnames){
var tag = new Hashtag({
name: tagnames[h]
});
tag.save(function (err, item) {
if (err) console.log('error:',err);
hashtags[item.name] = item;
});
}

创建主题标签后,您可以引用它们::

var item = new Item({
hashtags: [hashtags.a._id,hashtags.b._id,hashtags.c._id]
});
item.save(function (err, item) {
if (err) return res.json({ error: err });
res.json(item);
});

然后你可以使用populate自动将对象 ID 转换为文档:

Item.find({})
.populate('hashtags')
.exec(function (err, items) {
if (err) return handleError(err);
//items are populated with hashtags
});

如果您只是做简单的标记,那么subdocuments可能更适合。它们允许您一步声明并保存子文档。权衡是子文档仅属于其父文档。它们不是引用,因此必须手动完成对它们的任何聚合。

关于javascript - 模型之间的 Mongoose 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18580958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com