不使用ObjectId如何使Mongoose填充一个字段?

4

我有一个模式:

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之外的唯一字段填充实体字段。我该怎么做才能实现这个目标?

这个包可能会有所帮助 https://www.npmjs.com/package/mongoose-auto-increment,它将使用数字类型的 _id 从0,1 ++ 开始,而不是 ObjectId - parwatcodes
@p0k8_ 这不是我想要的。我已经有一个唯一的字段了。但它不是 _id。那么,我如何使用这个字段填充mongoose模型呢? - Emre Alparslan
你可以通过与 ObjectId 相同的方式来实现。根据 mongoose 的规定,有效的引用可以是 ObjectId、Number、String 和 Buffer。只要被引用的集合将该引用值作为其 _id 字段即可。 - Jyotman Singh
5个回答

3
尽管回答晚了,请查看 Mongoose 4.5.0 的 Populate Virtuals。
请点击下面的链接。

http://mongoosejs.com/docs/populate.html

如果您向下滚动或搜索“Populate Virtuals”,您将看到它正是您想要的。

0

const blogs = this.blogModel .find(find) .populate('blogCategory', 'name -_id');

注意:-_id将排除对象_id


0

我发现Views是一种有用的方法,虽然不确定它是否最有效!例如,在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}
});

-1

我不确定我是否正确理解了你的问题。

在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){
      // ---
   });

谢谢,


我不想使用“find”查询。我只想通过一个非ObjectID但唯一的字段来填充“entity”。 - Emre Alparslan

-5

使用加密来哈希一些唯一的东西,比如objectId,然后将其保存到您的实体中。

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

Ticket.entities = 哈希表;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接