【问题标题】:Cannot Query sub sub documents无法查询子子文档
【发布时间】:2019-12-28 06:43:37
【问题描述】:

我无法访问子子文档我想查询子文档实现后端分页以便我可以将它们呈现在单独的页面中

我已经尝试使用点表示法 something.something.something 甚至使用这个 ["something"]["something"]["something"] 数组,因为我最近发现对象是一种数组

这是模型Schema ||子架构

const modelSchema = new mongoose.Schema({
  modelname: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 250
  }
});

这是 Bikes 架构 ||父架构

const bikeSchema = new mongoose.Schema({
 make: {
    type: makeSchema,
    required: true
  }
})

这就是数据在 Mongodb 中的存储方式

 "_id" : ObjectId("5d5e13e8edcbbf038c1f9b8e"),
"make" : {
        "_id" : ObjectId("5d40f0b40268d80ac8c30973"),
        "makename" : "{ _id: 5d40f0b40268d80ac8c30973, makename: 'ducatii', __v: 0 }"
}

根据文档查询 makename ducatii 的预期输出是做这样的事情

console.log(bikes[0]["make"]["makename"]["makename"])

或者这个 console.log(bikes[0].make.makename.makename)

【问题讨论】:

  • 你能告诉我 console.log(bikes[0]) 的输出是什么
  • 我得到了数组中的第一项,因为 console.log(bikes) 的输出是一个数组
  • const makeSchema = new mongoose.Schema({ makename: { type: String, required: true, minlength: 5, maxlength: 250 } }); const bikeSchema = new mongoose.Schema({ make: { makename: makeSchema, required: true } })
  • 我是否应该删除所需的部分,因为这样做会产生此错误 Invalid schema configuration: True is not a valid type at path make.required
  • 另外,当使用 Joi 验证时,我还应该将其验证为 makeId:Joi.objectId().required(),

标签: node.js mongodb mongoose mongodb-query mongoose-schema


【解决方案1】:

需要注意的两点:

  1. 如果返回结果是一个MongoDB游标对象,那么你不能通过数组索引访问。您需要使用适当的方法从光标中检索项目。
  2. 您的第一个 makename 字段指向 JSON 字符串,而不是对象。您无法从 JSON 字符串访问嵌套的 makename.makename。在访问嵌套属性之前,您必须先将 JSON 解码为对象。

【讨论】:

  • 我尝试使用 JSON.parse() 解析它,但每次都会出现类似 Unexpected token 之类的错误
  • @chuklore 原因是您的 JSON 无效。例如,请注意您的 _id 值未包含在引号中。 _id 值仅作为字符串有效,但 JSON 解析无法将其识别为字符串。您需要解决数据格式错误的问题。
  • 感谢您提供的信息,因为我现在想了解更多关于 Json 以及它是如何存储和检索的
【解决方案2】:

这似乎是您如何存储子文档的问题。

例如:

bikes[0].make.makename 实际上是一个字符串,不是一个有效的对象。你也不能 JSON.parse 这个字符串,因为你必须用转义的双引号包裹每个键/值。

如果您能够正确存储此子文档,那么您应该可以按照您期望的方式使用该对象!

【讨论】:

  • 您能否建议我如何正确存储此子文档
  • 感谢您提供的信息,因为我今天学到了一些新东西
【解决方案3】:

要将文档嵌入到文档中,您必须执行以下操作

var childSchema = new Schema({ name: 'string' });

var parentSchema = new Schema({
  // Array of subdocuments
  children: [childSchema],
  // Single nested subdocuments. Caveat: single nested subdocs only work
  // in mongoose >= 4.2.0
  child: childSchema
});

你的情况

const modelSchema = new mongoose.Schema({
  makename: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 250
  }
});

const bikeSchema = new mongoose.Schema({
 make: {
    makename: modelSchema
  }
})

然后你可以像访问它

console.log(bikes[0]["make"]["makename"]["makename"])

【讨论】:

  • 我应该删除 required:true ,因为这会返回错误
  • 谢谢,这真的帮助了我我被困了将近 6 个小时,没有意识到我将它存储为字符串
  • 如果您想添加所需的验证,您可以通过添加 ref 而不是使其嵌入文档来做到这一点,子表将是新表并与父表有一对一的关系,请检查:mongoosejs.com/docs/populate.html
猜你喜欢
  • 2017-06-01
  • 2020-07-16
  • 2013-09-12
  • 2015-04-27
  • 1970-01-01
  • 2019-08-18
  • 2017-11-18
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多