Mongo / Express查询来自查询字符串的嵌套_id

时间:2016-07-24 04:55:18

标签: node.js mongodb express mongoose

使用:node / express / mongodb / mongoose

通过上面列出的设置,我创建了我的架构和模型,并可以根据需要进行查询。我想知道怎么做,将express request.query对象传递给mongoose中的Model.find()来匹配和查询嵌套文档的_id。在这种情况下,查询可能类似于:

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

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

可以这样做吗?

这是一个示例,而不是ACTUAL模式,但这可以解决这个问题。

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

这将返回一个空数组

2 个答案:

答案 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

答案 1 :(得分:0)

别介意我觉得很荒谬。它就像我在上面发布的那样工作..在我的模式中修复了错误。