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

时间:2015-08-15 19:23:32

标签: node.js mongodb mongoose

我正在尝试使用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()来说很重要?

谢谢!

1 个答案:

答案 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"));