Mongoose 中的数组介绍
Mongoose's Array
class 使用额外的 Mongoose 功能扩展 vanilla JavaScript 数组。 例如,假设您有一个博客文章架构,其中包含一个数组 tags
。
const blogPostSchema = Schema({
title: String,
tags: [String]
});
当你创建一个新的 BlogPost
文件 tags
property 是 vanilla JavaScript 数组 类的一个实例。 但它也有一些特殊的性质。
const blogPostSchema = Schema({
title: String,
tags: [String]
}, { versionKey: false });
const BlogPost = mongoose.model('BlogPost', blogPostSchema);
const doc = new BlogPost({
title: 'Intro to JavaScript',
tags: ['programming']
});
Array.isArray(doc.tags); // true
doc.tags.isMongooseArray; // true
例如,Mongoose 拦截 push()
呼吁 tags
数组,并且足够聪明,可以使用 $push
当你 save()
文件。
mongoose.set('debug', true);
doc.tags.push('web development');
// Because of 'debug' mode, will print:
// Mongoose: blogposts.updateOne({ _id: ObjectId(...) }, { '$push': { tags: { '$each': [ 'web development' ] } } }, { session: null })
await doc.save();
文档数组
这 tags
示例是一个基元数组。 Mongoose 还支持子文档数组。 这是定义数组的方法 members
,每个都有一个 firstName
和 lastName
财产。
const groupSchema = Schema({
name: String,
members: [{ firstName: String, lastName: String }]
});
doc.members
是一个普通 JavaScript 数组的实例,因此它具有所有常用功能,例如 slice()
和 filter()
。但它也包含一些特定于 Mongoose 的功能。
const groupSchema = Schema({
name: String,
members: [{ firstName: String, lastName: String }]
});
const Group = mongoose.model('Group', groupSchema);
const doc = new Group({
title: 'Jedi Order',
members: [{ firstName: 'Luke', lastName: 'Skywalker' }]
});
Array.isArray(doc.members); // true
doc.members.isMongooseArray; // true
doc.members.isMongooseDocumentArray; // true
例如,如果您设置第 0 个成员的 firstName
,Mongoose 会将其转换为 member.0.firstName
你打电话时 save()
。
const groupSchema = Schema({
name: String,
members: [{ firstName: String, lastName: String }]
}, { versionKey: false });
const Group = mongoose.model('Group', groupSchema);
const doc = new Group({
title: 'Jedi Order',
members: [{ firstName: 'Luke', lastName: 'Skywalker' }]
});
await doc.save();
mongoose.set('debug', true);
doc.members[0].firstName = 'Anakin';
// Prints:
// Mongoose: groups.updateOne({ _id: ObjectId("...") },
// { '$set': { 'members.0.firstName': 'Anakin' } }, { session: null })
await doc.save();
设置数组索引的注意事项
Mongoose 有一个 直接设置数组索引的已知问题 。 例如,如果您设置 doc.tags[0]
,Mongoose 更改跟踪不会获取该更改。
const blogPostSchema = Schema({
title: String,
tags: [String]
}, { versionKey: false });
const BlogPost = mongoose.model('BlogPost', blogPostSchema);
const doc = new BlogPost({
title: 'Intro to JavaScript',
tags: ['programming']
});
await doc.save();
// This change won't end up in the database!
doc.tags[0] = 'JavaScript';
await doc.save();
const fromDb = await BlogPost.findOne({ _id: doc._id });
fromDb.tags; // ['programming']
要解决此警告,您需要通知 Mongoose 的更改跟踪更改,或者使用 markModified()
方法 或通过显式调用 MongooseArray#set()
在数组元素上,如下所示。
// This change works. `set()` is a special method on Mongoose
// arrays that triggers change tracking.
doc.tags.set(0, 'JavaScript');
await doc.save();
const fromDb = await BlogPost.findOne({ _id: doc._id });
fromDb.tags; // ['JavaScript']
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 在 JavaScript 中禁用按钮
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论