javascript – 为什么在使用MongoDB的$push向数组添加新对象时添加了带有ObjectID的_id?

前端之家收集整理的这篇文章主要介绍了javascript – 为什么在使用MongoDB的$push向数组添加新对象时添加了带有ObjectID的_id?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Node.js和Mongoose.
玩家和锦标赛变量是Mongoose对象,就在之前获取.

我想在播放器对象的tournamentSessions字段中添加一个新的tournamentSession对象(不是Mongoose对象).我正在使用findOneAndUpdate来确保我不添加两次相同的锦标赛(使用“$ne”)

  1. Player.findOneAndUpdate({
  2. '_id': player._id,'tournamentSessions.tournament': {
  3. '$ne': tournament._id
  4. }
  5. },{
  6. '$push': {
  7. 'tournamentSessions': {
  8. 'tournament': tournament._id,'level': 1,'status': 'LIMBO','score': 0,}
  9. }
  10. },function(err,updatedPlayer) {
  11. // ...
  12. });

一切正常,除了包含ObjectID的“_id”字段被添加到tournamentSessions数组中新添加的会话中,我无法理解为什么会发生这种情况.

如果我手动添加“_id”字段并使用值“BLABLABLA”,则永远不会存储“_id”字段(因为它不应该,因为它未在模式中声明)

是的,这是模式:

  1. var Player = mongoose.model('Player',Schema({
  2. createdAt: { type: Date,default: Date.now },lastActiveAt: Date,clientVersion: String,tournamentSessions: [{
  3. tournament: { type: Schema.Types.ObjectId,ref: 'Tournament' },level: Number,status: String,score: Number
  4. }],friends: Array
  5. }));
  6.  
  7. var Tournament = mongoose.model('Tournament',open: Boolean,number: Number,reactionLimit: Number,deadlineAt: Date,stats: {
  8. total: Number,limbo: Number,blessed: Number,damned: Number
  9. }
  10. }));

解决方法

您可以通过使用自己的架构显式定义tournamentSessions数组来禁用_id字段,以便您可以将其 _id option设置为false:
  1. var Player = mongoose.model('Player',tournamentSessions: [new Schema({
  2. tournament: { type: Schema.Types.ObjectId,score: Number
  3. },{ _id: false })],friends: Array
  4. }));

猜你在找的JavaScript相关文章