mongoose:如何通过id

时间:2016-10-12 17:41:02

标签: node.js mongodb express mongoose

我不知道如何通过自己的id选择子文档。我尝试使用expressjs创建REST api," localhost:3000 / api / parent /:parent_id / child /: child_id" Moogose官方文档为here,代码为var doc = parent.children.id(id);,但在控制台中不断返回Cannot read property 'id' of undefinednull。是我的快递代码

var express = require('express');
var app = express();

var mongoose=require('mongoose');
mongoose.connect('mongodb://localhost/parent');

var ChildSchema=new mongoose.Schema({
  name:String
},{collection:"child"});

var ParentSchema=new mongoose.Schema({
  name:String,
  child:[ChildSchema]
},{collection:"parent"});

var Parent = mongoose.model('Parent', ParentSchema);
//
// var parentA=new Parent({name:"A 123",child:[{name:"A 1"},{name:"A 2"},{name:"A 3"}]});
// var parentB=new Parent({name:"B 123",child:[{name:"B 1"},{name:"B 2"},{name:"B 3"}]});
// var parentC=new Parent({name:"C 123",child:[{name:"C 1"},{name:"C 2"},{name:"C 3"}]});

// parentA.save();
// parentB.save();
// parentC.save();

app.get('/api/parent', function(req, res){
  Parent.find(function(err,data){
    res.json(data);
  });
});

app.get('/api/parent/:parent_id/child/:child_id', function(req, res){
  console.log(req.params.child_id);
  /*problem here!!!!!*/
  var doc = Parent.child.id(req.params.child_id);
  console.log(doc);
});

app.listen(3000,console.log("localhost:3000"));


如此如何通过其id选择子文档,任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

我可以发现的第一个问题是,您要为子文档创建一个集合,然后将完整文档嵌入到父文档中。 我没有真正测试过,但似乎很奇怪。要么嵌入文档,要么将其引用到另一个集合。

所以:

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

var parentSchema = new Schema({
  children: [childSchema]
})

或者:

var ChildSchema = new mongoose.Schema({
  name:String
},
{ collection:"child" });
mongoose.model('Child', ChildSchema);

var ParentSchema = new mongoose.Schema({
  children: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Child', default: null }]
},
{collection:"parent"});
mongoose.model('Parent', ParentSchema);

最后,mongoose文档中发布的示例是针对两个选项中的第一个。

答案 1 :(得分:0)

您首先需要找到父文档,然后才能通过children.id()获取子文件。

app.get('/api/parent/:parent_id/child/:child_id', function(req, res){
  Parent.findById(req.params.parent_id, function(err, parent) {
    console.log(req.params.child_id);
    var doc = parent.child.id(req.params.child_id);
    console.log(doc);
  });
});

另请参阅此http://mongoosejs.com/docs/subdocs.html了解mor信息。