ObjectId 的 NodeJS/Mongoose 模式数组

Posted

技术标签:

【中文标题】ObjectId 的 NodeJS/Mongoose 模式数组【英文标题】:NodeJS/Mongoose schema array of ObjectId 【发布时间】:2019-07-18 13:34:50 【问题描述】:

我正在尝试在 Mongoose 的模式中实现一个 ObjectId 数组。 我在互联网上搜索,发现这应该可以工作:

import mongoose from 'mongoose';
import Schema from 'mongoose';

const UserSchema = mongoose.Schema(
  nickName: 
    type: String,
    unique: true,
    required: true,
  ,
  follows: [
    type: Schema.Types.ObjectId, //HERE
    ref: 'User',
    default: []
  ],
, 
  strict: true,
);

const User = mongoose.model('User', UserSchema);
export default User;

或者这个

follows: 
          type: [Schema.Types.ObjectId], // HERE
          ref: 'User',
          default: []
  ,

我知道它们并不完全相同,但我没有在这两种情况下工作,而是出现了这个错误:

 Invalid schema configuration: `ObjectID` is not a valid type within the array `follows`.

我不知道他为什么告诉我 ObjectID(大写“ID”)无效,因为我没有声明任何这些。

我怎样才能做一个 objectId 数组? 我想要一个 ObjectId 数组,通过引用模式“用户”与用户关注的人

[编辑] 正如 Bhanu Sengar 在评论中提到的那样,我必须在 Schema 之前加上“mongoose”。

[ type: mongoose.Schema.Types.ObjectId, ref: 'User' ] 

正如 Halil SAFAK 所说,我删除了默认值。

它也不起作用,因为我在两个导入之间存在冲突

import mongoose from 'mongoose';
import Schema from 'mongoose';

【问题讨论】:

【参考方案1】:

我使用猫鼬填充属性检查我的代码。 这将有助于您理解。

类别架构

const mongoose  = require('mongoose');
const timestamps    = require('mongoose-timestamp');

const cateorySchema = new mongoose.Schema(
  category_name: 
    type: String,
    trim: true,
    required: true,
  ,
  active: 
        type: Boolean,
        default: true,
    
);

cateorySchema.plugin(timestamps); // automatically adds createdAt and updatedAt timestamps
module.exports = mongoose.model('Category',cateorySchema);

子类别架构

'use strict'

const mongoose    = require('mongoose');
const timestamps    = require('mongoose-timestamp');

const subCategorySchema = new mongoose.Schema(
    categories: type: mongoose.Schema.Types.ObjectId, ref: 'Category' ,
    subcategorytitle:
      type:String,
      trim:true,
      required: true
    ,
    active: 
        type: Boolean,
        default: true
    
);
subCategorySchema.plugin(timestamps); // automatically adds createdAt and updatedAt timestamps
module.exports = mongoose.model('Subcategory',subCategorySchema);

我希望这会对你有所帮助。如果您有任何疑问,请告诉我。

【讨论】:

您的示例显示了一个 ObjectId。通过在 Schema 中实现单个 ObjectId 没有任何问题。但是当我尝试做一个 ObjectId 数组时,我确实有一个。 如果你想使用 ObjectId 的数组,那不是问题。你只需在数组内部进行 wap。喜欢的类别:[ type: mongoose.Schema.Types.ObjectId, ref: 'Category' ] 这行得通,谢谢。我忘了把“猫鼬”放在“架构”之前。现在它起作用了。事实是它不是数组时没有“mongoose”可以工作,但是当它是数组时它不起作用。【参考方案2】:

实际上,错误不在 ObjectId 中,而是在您的配置中。您在'follows'中定义objectId,然后将数组写入默认值,但这实际上不是ObjectId类型的对象类型,所以这里是错误的。如下定义,你不会有任何问题。

follows: [
    type: Schema.Types.ObjectId, //HERE
    ref: 'User'
  ],

follows: [Schema.Types.ObjectId],

在这两种定义中,MongoDB 填充查询都可以工作。

【讨论】:

这是我在设置默认值并发布此线程之前尝试过的,但我仍然有同样的错误...... 没有解决问题,同样的错误依然存在。

以上是关于ObjectId 的 NodeJS/Mongoose 模式数组的主要内容,如果未能解决你的问题,请参考以下文章

一个 ObjectId 的 ObjectId 的 Mongoose 查询数组

BSON::ObjectId 与 Mongo::ObjectID

BSON::ObjectId 与 Mongo::ObjectID

Mongoose 不在数组的 objectid 中填充 objectid

MongoDb - 要创建一个新的ObjectId,请尝试`Mongoose.Types.ObjectId`而不是使用`Mongoose.Schema.ObjectId`

变量名:“objectId”或“idObject”?