我正在尝试使用 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 使用 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"));
关于node.js - Mongo DB 文档只返回 "_id" "$oid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028468/