【问题标题】:MongoDB - is there a better way to store a list of ObjectIDs?MongoDB - 有没有更好的方法来存储 ObjectID 列表?
【发布时间】: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],
});

【问题讨论】:

标签: mongodb mongoose mongoose-schema mongoose-models


【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2010-09-09
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多