我正在尝试使用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/

10-09 18:17
查看更多