Mongoose是否填充没有ObjectId的字段?

时间:2017-03-31 11:15:04

标签: node.js mongoose populate

我有一个架构:

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以外的唯一字段填充实体字段。 我怎样才能做到这一点?

4 个答案:

答案 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

向下滚动或搜索“填充虚拟”,您将看到它完全符合您的要求。