如何在mongoose中将ObjectId设置为数据类型

时间:2011-11-13 13:26:02

标签: node.js mongoose

在mongoHQ和mongoose上使用node.js,mongodb。我正在为类别设置架构。我想使用文档ObjectId作为我的categoryId。

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Category = new Schema({
    categoryId  : ObjectId,
    title       : String,
    sortIndex   : String
});
然后我跑

var Category = mongoose.model('Schema_Category');
var category = new Category();
category.title = "Bicycles";
category.sortIndex = "3";

category.save(function(err) {
  if (err) { throw err; }
  console.log('saved');
  mongoose.disconnect();     
});

请注意,我没有为categoryId提供值。我假设mongoose将使用模式生成它,但文档具有通常的“_id”而不是“categoryId”。我做错了什么?

5 个答案:

答案 0 :(得分:100)

与传统的RBDM不同,mongoDB不允许您将任何随机字段定义为主键,所有标准文档都必须存在_id字段。

因此,创建一个单独的uuid字段是没有意义的。

在mongoose中,ObjectId类型不用于创建新的uuid,而是主要用于引用其他文档。

以下是一个例子:

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Product = new Schema({
    categoryId  : ObjectId, // a product references a category _id with type ObjectId
    title       : String,
    price       : Number
});

正如您所看到的,使用ObjectId填充categoryId没有多大意义。

但是,如果你想要一个名字很好的uuid字段,mongoose提供的虚拟属性允许你代理(引用)一个字段。

检查出来:

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Category = new Schema({
    title       : String,
    sortIndex   : String
});

Schema_Category.virtual('categoryId').get(function() {
    return this._id;
});

所以现在,每当你调用category.categoryId时,mongoose只会返回_id。

您还可以创建“设置”方法,以便设置虚拟属性,然后查看this link 了解更多信息

答案 1 :(得分:22)

我正在寻找问题标题的不同答案,所以也许其他人也会这样。

要将类型设置为ObjectId(例如,您可以引用author作为book的作者),您可以这样做:

const Book = mongoose.model('Book', {
  author: {
    type: mongoose.Schema.Types.ObjectId, // here you set the author ID
                                          // from the Author colection, 
                                          // so you can reference it
    required: true
  },
  title: {
    type: String,
    required: true
  }
});

答案 2 :(得分:2)

我使用ObjectId的解决方案

// usermodel.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const ObjectId = Schema.Types.ObjectId


let UserSchema = new Schema({
   username: {
     type: String
   },
   events: [{
     type: ObjectId,
     ref: 'Event' // Reference to some EventSchema
   }]
})

UserSchema.set('autoIndex', true)

module.exports = mongoose.model('User', UserSchema)

使用mongoose的populate方法

// controller.js

const mongoose = require('mongoose')
const User = require('./usermodel.js')

let query = User.findOne({ name: "Person" })

query.exec((err, user) => {
  if (err) {
     console.log(err)
  }

  user.events = events
  // user.events is now an array of events
})

答案 3 :(得分:1)

可以直接定义ObjectId

var Schema = new mongoose.Schema({ categoryId : 猫鼬.Schema.Types.ObjectId, 标题:字符串, sortIndex : 字符串 })

注意:需要导入mongoose模块

答案 4 :(得分:0)

@dex提供的解决方案为我工作。但我想添加一些对我有用的东西:使用

let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR_CELL_IDENTIFIER", for: indexPath)

如果您要创建的是数组引用。但是,如果你想要的是一个Object引用,这是我认为你可能正在寻找的,删除 value prop中的括号,如下所示:

let UserSchema = new Schema({
   username: {
     type: String
   },
   events: [{
     type: ObjectId,
     ref: 'Event' // Reference to some EventSchema
   }]
})

仔细看看2个片段。在第二种情况下,键事件的值prop在对象def上没有括号。