2016-07-24 64 views
0

使用:节点/快递/的MongoDB /猫鼬蒙戈/快递查询嵌套_id从查询字符串

上面列出的设置,我创建了我的架构和模型,并根据需要可以查询。我想知道如何做,但是,将明文request.query对象传递给mongoose中的Model.find()以匹配和查询嵌套文档的_id。在这种情况下,查询可能如下所示:

http://domain.com/api/object._id=57902aeec07ffa2290f179fe 

其中object是数据库中其他位置存在的嵌套对象。我可以轻松地查询其他字段。 _id是唯一一个提出问题的人。它返回一个空的数组。

可以这样做吗?

这是一个例子,而不是实际的模式,但这种跨越得到点..

let Category = mongoose.Schema({ 
    name: String 
}) 

let Product = mongoose.Schema({ 
    name: String, 
    description:String, 
    category:Category 
}) 

// sample category.. 
{ 
    _id:ObjectId("1234567890"), 
    name: 'Sample Category' 
} 

// sample product 
{ 
    _id:ObjectId("0987654321"), 
    name:'Sample Product', 
    description:'Sample Product Description', 
    category: { 
     _id:ObjectId("1234567890"), 
     name: 'Sample Category' 
    } 
} 

所以,我正在寻找的是......如果我有快递以下..

app.get('/products',function(req,res,next){ 
    let query = req.query 
    ProductModel.find(query).exec(function(err,docs){ 
     res.json(docs) 
    }) 
}) 

这将允许我在查询参数中指定任何我想要的查询。所以,我可以..

http://domain.com/api/products?name=String 
http://domain.com/api/products?description=String 
http://domain.com/api/products?category.name=String 

我可以这样category.name查询,但我不能这样做:

http://domain.com/api/products?category._id=1234567890 

这将返回一个空数组

+0

请添加一些代码或模式 –

回答

0

更改您的查询http://domain.com/api/object/57902aeec07ffa2290f179fe并尝试

app.get('/api/object/:_id', function(req, res) { 

    // req._id is Mongo Document Id 
    // change MyModel to your model name 
    MyModel.findOne({'_id' : req._id }, function(err, doc){ 
     // do smth with this document 
     console.log(doc); 
    }); 

}); 

或者试试这个 http://domain.com/api/object?id=57902aeec07ffa2290f179fe

app.get('/api/object', function(req, res) { 
    var id = req.param('id'); 
    MyModel.findOne({'_id' : id }, function(err, doc){ 
     console.log(doc); 
    }); 
}) 

  1. 首先本文通过提高自己的技能getting URL and POST Parameters
  2. 阅读官方Express 4.x API Documentation
+0

也许我没有正确描述我正在寻找的东西.. – dferg

+0

查看更新的帖子,看看是否更有意义 – dferg

0

别介意我觉得可笑。它的工作原理就像我在上面发布的那样..在我修正了模式中的一个错误之后。