Mongo DB Document仅返回带有"$ oid"的"_id"

use*_*529 4 mongoose mongodb node.js

我正在尝试使用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);
    });
});
Run Code Online (Sandbox Code Playgroud)

它根本行不通.我一直变空.但文件存在.当我在所有文件上进行GET时,我可以看到它.

然后我终于得到了另一份文件.

区别?返回的记录具有以下格式的ID:

{
  "_id": { "$oid":"1234567890abc"}
}
Run Code Online (Sandbox Code Playgroud)

但是没有返回的记录有这样的:

{
   "_id": "1234567890abc"
}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下吗?我用Postman输入了数据,我没有在条目之间做任何不同的事情.

什么是$ oid?什么创造了$ oid?为什么嵌套对于mongoose的findById()很重要?

谢谢!

Art*_*kii 5

$oid来自严格的MongoDB Extended JSON.

您对包含_id条件的MongoDB数据库的所有查询都应该包含_idObjectId以下函数中:

db.resources.findOne({_id: ObjectId("507c35dd8fada716c89d0013")}; 
Run Code Online (Sandbox Code Playgroud)

MongoLab提供了通过JSON语法查询MongoDB的UI.但是你不能ObjectId在JSON中使用规范限制.

因此,MongoLab使用Strict MongoDB Extended JSON作为别名ObjectId()- > $oid.

{"_id": {"$oid":"507c35dd8fada716c89d0013"})
Run Code Online (Sandbox Code Playgroud)

$oid您在输出中看到的相同,因为MongoLab UI也使用JSON.

Mongoose会自动将字符串转换_id为MongoDB查询,因此您无需手动执行此操作.以下查询是等效的:

Resource.findById("507c35dd8fada716c89d0013");
Resource.findById(new mongoose.Types.ObjectId("507c35dd8fada716c89d0013"));
Run Code Online (Sandbox Code Playgroud)