创建包含嵌套对象(例如对象数组)的文档时,每个对象都有自己的_id.例如,我的模式如下所示:

mongoose = require "mongoose"

Schema = mongoose.Schema

schema = new Schema
  name:
    type: String
    required: true
    unique: true
    trim: true

  lists: [
    list:
      type: Schema.Types.ObjectId
      required: true
      ref: "List"
    allocations: [
      allocation:
        type: Number
        required: true
    ]
  ]

  createdAt:
    type: Date
    default: Date.now

  updatedAt:
    type: Date

# Ensure virtual fields are serialised.
schema.set "toJSON",
  virtuals: true

exports = module.exports = mongoose.model "Portfolio", schema

最终创建文档时,lists数组中的每个对象都会被赋予一个_id,lists.allocations数组中的每个allocation对象也是如此.这似乎是对文档的过度杀戮和inflating ,但MongoDB(或Mongoose)是否有理由需要文档包含这些附加信息?如果没有,我想阻止它发生,这样唯一的_id就在根文档上.

此外,Mongoose会自动为_id创建一个虚拟的id,我需要它,因为我的客户机代码需要一个字段id.这就是为什么我要用JSON返回virtuals.然而,由于整个文档中有_id个字段,而不仅仅是根字段,所以这个虚拟字段复制了all个字段.如果没有办法阻止附加的_id字段,我如何才能让虚拟文档只应用于根文档_id?或者如果有更好的方法来做我想用它做的事情,那会是什么?

推荐答案

我已经找到了一种用同样的技术解决这两个问题的方法:对每个嵌套对象类型使用显式模式,并将其_idid选项设置为false.似乎在嵌套您定义的"内联"对象时,Mongoose会在幕后为这些对象创建模式.由于模式的默认值是_id: trueid: true,因此它们将获得_id以及虚拟id.但通过用显式模式覆盖它,我可以控制_id的创建.更多代码,但我得到了我想要的:

mongoose = require "mongoose"

Schema = mongoose.Schema

AllocationSchema = new Schema
  allocation:
    type: Number
    required: true
,
  _id: false
   id: false

mongoose.model "Allocation", AllocationSchema

ListsSchema = new Schema
  list:
    type: Schema.Types.ObjectId
    required: true
    ref: "List"
  allocations: [AllocationSchema]
,
  _id: false
   id: false

mongoose.model "Lists", ListsSchema

PortfolioSchema = new Schema
  name:
    type: String
    required: true
    unique: true
    trim: true

  lists: [ListsSchema]

  createdAt:
    type: Date
    default: Date.now

  updatedAt:
    type: Date

Mongodb相关问答推荐

映射数组值并查找每个匹配的集合

在mongdob中按子文档筛选不起作用

Spring数据MongoDB(聚合)

在不知道字段名称的情况下如何引用 MongoDB 中的字段?

如何获取mongodb ObjectId的值?

随着时间的推移在 mongodb 中获得

$lookup 的参数必须是字符串

MongoDB聚合 - 用另一个数组过滤数组

更新 mongoengine 中的嵌入文档列表

mongod 和 mongo 命令在 Windows 10 上不起作用

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

如何在array.NET驱动程序中的元素属性上创建MongoDB MultiKey索引

MongoDB 存储 ObjectId 的数组

majority和 linearizable的区别

Spring Data MongoDB 中的独特之处

在 mongoose 中使用 UUID 进行 ObjectID 引用

带有 either or查询的mongoose findOne

mongodb安装失败运行mongod

MongoDB聚合框架的索引优化

MongoDB:删除唯一约束