我有一个Mongoose模式,其中我使用时间戳选项自动向文档添加createdAtupdatedAt个字段.但是,我只想将时间戳应用于子文档,而不是主文档.

以下是我的方案的一个示例:

const feedSchema = new mongoose.Schema(
  {
    userId: {
      type: String,
      required: true,
    },
    feed: [
      new mongoose.Schema(
        {
          // ... (subdocument fields)
        },
        { _id: false, timestamps: true } }
      ),
    ],
  },
  {
    _id: false,
    timestamps: false,
    versionKey: false,
  }
);

问题是,即使我只为子文档模式设置了timestamps: true,Mongoose仍然向主文档添加时间戳,即使我禁用了它们.

有没有办法将Mongoose配置为只将时间戳应用于feed数组中的子文档,而不应用于主文档?

推荐答案

解决这个问题的最好方法是--不要使用Model.create()来创建文档,而是结合使用new Model()doc.save().这将允许您在呼叫save()时传递{timestamps: false}选项.下面是一个例子:

const feedSchema = new mongoose.Schema(
  {
    userId: {
      type: String,
      required: true,
    },
    feed: [
      new mongoose.Schema(
        {
          // ... (subdocument fields)
        },
        { _id: false, timestamps: true } }
      ),
    ],
  },
  {
    // _id: false, //< delete this
    timestamps: false,
    versionKey: false,
  }
);

const Feed = mongoose.model('Feed', feedSchema);

const newFeed = {
   userId: '123',
   feed: [
      {
         a: 'abc',
         b: 'xyz'
      }
   ]
};

const doc = new Feed(newFeed);
await doc.save({ timestamps: false });

这会将时间戳添加到父文档上的subdocumentsnot.

Note:您需要删除父架构上的_id : false,因为Mongoose文档在保存之前需要_id.

Mongodb相关问答推荐

在MondoDB中:将对象数组从切片索引数组切片,并通过聚合推入数组

Mongo DB-如果一个特定字段有多个文档匹配,则更新文档字段

如何在MongoSH中的现有文档中插入字段

MongoDB聚合$group阶段$top与$first在大型数据集上的效率

MongoDB - 将对象转换为数组

使用 mongodb 时是否需要规范化数据库?

看起来当我执行 fs.writeFile() 时,更改的文件会重新启动 nodemon.怎么让它不重启?

Mongodb:查询嵌套在数组中的json对象

$lookup 结果 mongodb 的计数

从 mongodb 中的副本配置重新开始

无法将 $match 运算符用于带有 ObjectId 的 mongodb/mongoose 聚合

spring-data-mongo - 可选查询参数?

MongoDB - 投影一个并不总是存在的字段

如何获取 Mongoid 文档的所有字段名称?

具有简单密码认证的 MongoDB 副本集

Ruby 按键值分组哈希

Cannot connect to MongoDB errno:61

MongoDB 范围查询中 $lt 和 $gt 的顺序

如何向 mongodb 2.6 添加身份验证?

我在更新中对 $set 和 $inc 做错了什么