在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”。我做错了什么?
答案 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上没有括号。