我正在尝试使用MEAN堆栈的非常简单的CRUD API。我在mongolab沙箱数据库中输入了几个文档。我可以对所有文档进行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()很重要?
谢谢!
最佳答案
$oid
来自Strict MongoDB Extended JSON。
您对包含_id
条件的MongoDB数据库的所有查询都应将_id
包装在ObjectId
函数中,如下所示:
db.resources.findOne({_id: ObjectId("507c35dd8fada716c89d0013")};
MongoLab提供了用于通过JSON语法查询MongoDB的UI。但是由于规范限制,您不能在JSON中使用
ObjectId
。因此,MongoLab使用严格的MongoDB扩展JSON作为别名
ObjectId()
-> $oid
。{"_id": {"$oid":"507c35dd8fada716c89d0013"})
您在输出中看到的
$oid
相同,因为MongoLab UI也使用JSON。Mongoose自动将字符串
_id
转换为MongoDB查询,因此您无需手动执行。以下查询是等效的:Resource.findById("507c35dd8fada716c89d0013");
Resource.findById(new mongoose.Types.ObjectId("507c35dd8fada716c89d0013"));
关于node.js - Mongo DB文档仅返回带有 “_id”的 “$oid”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32028468/