Mongoose 中的数组介绍

发布于 2022-07-07 19:58:04 字数 4247 浏览 1154 评论 0

Mongoose's Array class 使用额外的 Mongoose 功能扩展 vanilla JavaScript 数组。 例如,假设您有一个博客文章架构,其中包含一个数组 tags

const blogPostSchema = Schema({
  title: String,
  tags: [String]
});

当你创建一个新的 BlogPost文件 tagsproperty 是 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,每个都有一个 firstNamelastName 财产。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文