MongoDB - 有没有更好的方法来存储 ObjectID 列表?

Posted

技术标签:

【中文标题】MongoDB - 有没有更好的方法来存储 ObjectID 列表?【英文标题】:MongoDB - is there a better way to store a list of ObjectIDs? 【发布时间】:2021-02-23 16:55:39 【问题描述】:

假设我有一个用户架构/模型,并且用户有一个朋友列表。 Mongoose 希望您将您的朋友列表(外键/ObjectID 类型)存储为一个数组,对吗?这意味着如果我想通过 ID 找到我的朋友,Mongoose 将搜索数组,直到找到具有我想要的 ID 的朋友的第一个实例。那似乎真的时间效率低,不是吗?有没有更好的办法?

const FriendSchema = new Schema(
  username:  type: String, required: true, unique: true ,
);

const UserSchema = new Schema(
  username:  type: String, required: true, unique: true ,
  friends: [FriendSchema],
);

【问题讨论】:

这能回答你的问题吗? How To Create Mongoose Schema with Array of Object IDs? 【参考方案1】:

使用ref 引用另一个架构中的文档并调用populate 以获取引用的文档。

// friend.model.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const FriendSchema = new Schema(
  username:  type: String, required: true, unique: true ,
);
module.exports = mongoose.model('Friend', FriendSchema);
// user.model.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const UserSchema = new Schema(
  username:  type: String, required: true, unique: true ,
  friends: [ type: Schema.Types.ObjectId, ref: 'Friend' ],
);
module.exports = mongoose.model('User', UserSchema);
const User = require('user.model.js');

User.find(...)
  .populate('friends')
  .exec()

【讨论】:

嗨,马特,感谢您的评论!同意这样更有效率。我仍然想知道如何构造数据,以便您可以通过 ID 找到朋友,而无需猫鼬遍历整个数组(常数与线性时间复杂度)【参考方案2】:

我正在寻找的部分内容是:

索引允许您“迭代”通过数组或集合中的字段,而无需查看每一个。因此,为了确保您不会浪费时间进行迭代,您可以在任何字段上创建一个“索引”,并使其可以在二叉树结构中进行搜索。 https://docs.mongodb.com/manual/indexes/

数组已经使字段成为“键”,因此您无需担心通过其中一个元素的字段名称搜索数组的时间复杂度。 https://docs.mongodb.com/manual/core/index-multikey/

【讨论】:

以上是关于MongoDB - 有没有更好的方法来存储 ObjectID 列表?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好、更干净的方法来编写这个本地存储数据

有没有比 `const` 更好的方法来存储大块文本?

存储过程花费的时间太长,有没有更好的方法来做到这一点/优化?

从 MongoDB 获取大数据的最佳方法

MongoDb 中的条件更新

如何更好地重构可以在 java 中返回 null 的方法链?