NodeJS Mongoose填充没有ObjectId的字段?

tpgth1q7  于 2023-02-03  发布在  Node.js
关注(0)|答案(5)|浏览(168)

我有一个模式:

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以外的唯一字段填充实体字段。如何实现呢?

2vuwiymt

2vuwiymt1#

虽然回答晚了。请检查Mongoose 4.5.0的填充虚拟
点击下面的链接
http://mongoosejs.com/docs/populate.html
然后向下滚动或搜索填充虚拟,你会看到它完全按照你想要的做。

6ovsh4lw

6ovsh4lw2#

我发现视图是一种有用的方法,尽管不确定它是否是最有效的!例如,在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 } }])

由此创建的新视图“分级-电影-视图”具有所需字段“标题”和“类型”。

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"
        }
    ]
}

希望这个有用!
不熟悉movielen数据的人这里是schema

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}
});
q35jwt9p

q35jwt9p3#

const blogs =这个.blogModel .find(查找).populate('博客类别','名称-_id');
注意-_id将排除object _id

ttygqcqt

ttygqcqt4#

我不确定我是否正确理解了你的问题。
在Mongoose模型中,如果我们没有指定主键,它会自动添加一个名为 * ObjectId * 的额外字段,并为每个对象分配一个唯一的值。
如果我们需要指定自己的键,可以通过指定 * key * 属性来完成。
例如:

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'
    }
  }]
});

希望你是这个意思。
如果您询问基于Items-〉entity的属性获取对象的问题,

Todo.find({'items.entity.type':required_type}, function(err, foundTodos){
      // ---
   });

谢谢你,

wlsrxk51

wlsrxk515#

使用crypto来散列一些唯一的东西,如objectId,然后将其保存到实体中。

Var hash = crypto.createHmac('sha256', ticket.objectId).digest('hex');

票证.实体=散列;

相关问题