我正在尝试使用MEAN堆栈的非常简单的CRUD API。我在mongolab沙箱db中输入了几个文件。我可以对所有文件进行GET,他们都会被退回。然后我通过ID测试了GET:
router.route('/api/v1/resources/:resource_id')
// get the resource with that id (accessed at GET http://localhost:8080/api/resources/:resource_id)
.get(function(req, res) {
Resource.findById(req.params.resource_id, function(err, resources) {
if (err)
res.send(err);
res.json(resources);
});
});
它根本行不通。我一直变空。但文件存在。当我对所有文件进行GET时,我可以看到它。
然后我又拿到了另一份文件。
区别?返回的记录具有以下格式的ID:
{
"_id": { "$oid":"1234567890abc"}
}
但没有返回的记录有这个:
{
"_id": "1234567890abc"
}
有人可以向我解释一下吗?我用Postman输入了数据,我没有在条目之间做任何不同的事情。
什么是$ oid? 什么创造了$ oid? 为什么嵌套对于mongoose的findById()来说很重要?
谢谢!
答案 0 :(得分:5)
$oid
来自Strict MongoDB Extended JSON。
对包含_id
条件的MongoDB数据库的所有查询都应在_id
函数中包含ObjectId
,如下所示:
db.resources.findOne({_id: ObjectId("507c35dd8fada716c89d0013")};
MongoLab提供了通过JSON语法查询MongoDB的UI。但是,由于规范限制,您无法在JSON中使用ObjectId
。
因此,MongoLab使用 Strict MongoDB Extended JSON 作为别名ObjectId()
- > $oid
。
{"_id": {"$oid":"507c35dd8fada716c89d0013"})
您在输出中看到的是$oid
,因为MongoLab UI也使用JSON。
Mongoose会自动将字符串_id
转换为MongoDB查询,因此您无需手动执行此操作。以下查询是等效的:
Resource.findById("507c35dd8fada716c89d0013");
Resource.findById(new mongoose.Types.ObjectId("507c35dd8fada716c89d0013"));