在mongoose中通过id获取

时间:2017-12-07 18:55:49

标签: node.js express mongoose

如果我想通过id获取一个只是文档中数组的子文档,我需要如何调用它?我有这些模型

/* Build */
var buildSchema = new Schema({
  buildName: String,
  package: [packageSchema],
  postedBy: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'user'
  }
})
var Build = mongoose.model('build', buildSchema)

/* Project */
var projectSchema = new Schema({
  projectName: String,
  build: [buildSchema],
  postedBy: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'user'
  }
})
var Project = mongoose.model('project', projectSchema)

我的获取功能和路线是这样的:

router.get('/build/:id', function (req, res, next) {
  var token = helperJwt.decodeToken(req)
  jwt.verify(token, helperJwt.secret, function (error, decoded) {
    if (error) {
      res.status(401)
    } else {
      Project.findOne({ _id: req.params.id}, 'build', function (err, build) {
        if (err) {
          res.status(401)
        } else {
          build.findOne({build: build._id}, 'postedBy', 'email', function (err, getBuild) {
            if (err) {
              res.status(401)
            } else {
              return status(200).json(build)
            }
          })
        }
      })
    }
  })
})

这是好的,或者我怎么能只获得一个构建?

我正在使用vue作为前端,但它不能只识别一个构建数据。

我不知道如何找到一个子文档。

我想带点像:

{
    "_id" : ObjectId("5a26fbfd1866893baf14b175"),
    "postedBy" : "5a2021539f1d222bfc915fa2",
    "projectName" : "El pipiripau",
    "build" : [ 
        {
            "buildName" : "bdfbdgf",
            "postedBy" : ObjectId("5a2021539f1d222bfc915fa2"),
            "_id" : ObjectId("5a26fc0dbe4de0039cdae0c7"),
            "package" : []
        }, 
}

1 个答案:

答案 0 :(得分:0)

如果您在 projectSchema 中使用 buildSchema ,则构建数组将包含子文档,因此它们不会有ID。

您可以在构建架构中设置自定义ID字段,然后在查询中引用该字段,但在保存项目文档时必须注意设置这些ID。

或者,如果您的构建文档存储在单独的集合中(因为您有构建模型),那么它们将具有 _id 字段,您可以在 projectSchema 中存储对构建模型的引用数组:

var projectSchema = new Schema({
  projectName: String,
  build: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'build'
  }],
  postedBy: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'user'
  }
})

然后,假设 req.params.id 构建文档的ID,您可以找到构建数组所具有的项目id,然后使用填充构建 ID数组替换为相应的子文档:

Project
  .find({ build: req.params.id })
  .populate('build')
  .exec(function (err, projects) {
    if (err) {
      // Handle error
    } else {
      // For each project, filter builds for just the one matching the id param
      projects.forEach(project => {
        project.build = project.build.filter(item => item._id == req.params.id )
      })
      // Handle result
    }
  })

以下是有关人口的文件: http://mongoosejs.com/docs/populate.html

我希望这会有所帮助。