Mongoose - 如何替换 _id 作为主索引?

Posted

技术标签:

【中文标题】Mongoose - 如何替换 _id 作为主索引?【英文标题】:Mongoose - how to replace _id as primary index? 【发布时间】:2019-03-11 04:19:35 【问题描述】:

鉴于以下示例架构,有没有办法让“电子邮件”成为 UserSchema 上的主索引,而不是默认的“_id”(假设电子邮件始终是唯一的)? 如果可能的话,当它是主索引时,搜索“电子邮件”的性能会更好吗?

另外,作为替代方案,是否可以对复合字段或复合字段进行主索引如果可以,“firstName.firstName”上的主键的语法是什么样的? 在这种情况下,StorySchema 将如何引用 UserSchema。语法看起来相同还是不同?

var mongoose = require("mongoose");

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const StorySchema = new Schema(
  title: 
    type: String,
    required: true
  ,
  body: 
    type: String,
    required: true
  ,
  user: 
    type: Schema.Types.ObjectId,
    ref: 'users'
  ,
  date: 
    type: Date,
    default: Date.now
  
);
mongoose.model('stories', StorySchema);

const UserSchema = new Schema(
  _id: false,
  email: 
    type: String,
    required: true
  ,
  firstName: 
    type: String
  ,
  lastName: 
    type: String
  ,
);
mongoose.model('users', UserSchema);

【问题讨论】:

一种选择是将电子邮件 ID 存储在 _id 字段中。 我找不到任何名为primary index 的概念,你的意思是primary key?在您正确选择它们之前,索引之间不会有性能 ‍‍优势。 【参考方案1】:

毕竟,mongoose 文档可能会有所帮助。我不确定 1 代表什么。例如:_id: 1 ..., groupNumber: 1 ... lastname: 1 ....

https://docs.mongodb.com/master/core/index-unique/

看起来像是使用一个或多个字段定义主键的示例:

 _id: 1, a: [  loc: "A", qty: 5 ,  qty: 10  ] 

定义复合二级索引的示例。

db.members.createIndex(  groupNumber: 1, lastname: 1, firstname: 1 ,  unique: true  )

【讨论】:

以上是关于Mongoose - 如何替换 _id 作为主索引?的主要内容,如果未能解决你的问题,请参考以下文章

mongoose 在 express 中使用 _id 链接两个集合,并将 id 作为数字或字符串插入

为啥 Mongoose 用 _id 替换对象中的键/值对?

Mongoose 6 $group with Typescript -> Property '_id' 与索引签名不兼容

在 Mongoose 中插入新的重复记录时替换旧记录

Mongoose 在结果的 _id 字段中返回“new ObjectId”

Mongoose / MongoDB _id 作为字符串