我有一个架构:
var Schema = mongoose.Schema;
var TicketSchema = new Schema({
externalId: String,
name: String,
items: [{
externalId: String,
price: Number,
quantity: {
type: Number,
default: 1
},
comment: {
type: String,
default: '',
trim: true
},
entity: {
type: String,
ref: 'Entity'
}
}],
tableId: String
});
mongoose.model('Ticket', TicketSchema);
我想用ObjectId以外的唯一字段填充实体字段。 我怎样才能做到这一点?
答案 0 :(得分:0)
我不确定我是否理解你的问题。
在Mongoose模型中,如果我们没有指定主键,它会自动添加一个名为 ObjectId 的额外字段,并为每个对象分配一个唯一值。
如果我们需要指定自己的密钥,我们可以通过指定密钥属性来完成。
例如:
mongoose.model('Todo', {
todoID: {
type: String,
key: true
},
text: {
type: 'text'
},
done: {
type: Boolean,
default: false,
},
date: {
type: Date,
},
items: [{
entity: {
type: String,
ref: 'Entity'
}
}]
});
我希望,这就是你的意思。
如果您要求根据项目获取对象 - >实体的财产,
Todo.find({'items.entity.type':required_type}, function(err, foundTodos){
// ---
});
谢谢,
答案 1 :(得分:0)
使用crypto对objectId之类的唯一内容进行哈希处理,然后将其保存到实体中。
Var hash = crypto.createHmac('sha256', ticket.objectId).digest('hex');
Ticket.entities = hash;
答案 2 :(得分:0)
我发现视图是一种有用的方法,但不确定它是最有效的!例如,在movielens数据库中,我想使用'movieId'作为外键,将评级集合中的'movieId'引用到电影集合中的'movieId'。
db.createView('rating-movie-view','ratings',[{$lookup:{from:"movies",localField:"movieId",foreignField:"movieId",as:"ratings_movie"}},{ $project:{'userId':1,'movieId':1,'rating':1,'timestamp':1,'ratings_movie.title':1,'ratings_movie.genres':1 } }])
由此创建的新视图“rating-movie-view”具有必填字段的标题和'流派'。
db["rating-movie-view"].findOne()
{
"_id" : ObjectId("598747c28198f78eef1de7a3"),
"userId" : 1,
"movieId" : 1129,
"rating" : 2,
"timestamp" : 1260759185,
"ratings_movie" : [
{
"title" : "Escape from New York (1981)",
"genres" : "Action|Adventure|Sci-Fi|Thriller"
}
]
}
希望这有用!
那些不熟悉movielens数据的人是架构
var MovieSchema = new mongoose.Schema({
movieId: Number,
title: String,
genres: String,
});
var RatingSchema = new mongoose.Schema({
userid: Number,
movieId:Number,
rating: Number,
timestamp:Number,
});
//查看架构
var RatingViewSchema = new mongoose.Schema({
userid: Number,
movieId:Number,
rating: Number,
timestamp:Number,
rating_movie:{title:String,genres:String}
});
答案 3 :(得分:0)
虽然回答很晚。请检查Populate Virtuals for Mongoose 4.5.0
点击下面的链接
http://mongoosejs.com/docs/populate.html
向下滚动或搜索“填充虚拟”,您将看到它完全符合您的要求。