【问题标题】:How to get data from mongodb using _id.$oid object?如何使用 _id.$oid 对象从 mongodb 获取数据?
【发布时间】:2015-11-09 06:35:40
【问题描述】:

我正在尝试查找具有登录用户 ID 的对象。

function getItems(req, res) {
    var userId = JSON.stringify(req.user._id);

    Items.find({user_id: userId}, function(err, items) {
        if (err) {
            res.send(err)
        }
        else {
            res.json(items);
        }
    }); 
}

// Logged-in user
app.get('/userItems', isLoggedIn, function(req, res) {
    getItems(req, res);
});

用户 json 数据如下:

"_id": {
     $oid": "55c772bce97e9a500b3754ae"
}

Item 对象是这样的:

{
    "_id": {
        "$oid": "55d086a182377f840844ee78"
    },
    "user_id": "55c772bce97e9a500b3754ae",
    itemSpecs:[
        //...
    ]
}

它返回空数组,因为我猜 userId 与 user_id 不匹配。当我尝试设置时:

var userId = '55c772bce97e9a500b3754ae';

它返回带有 userId 的项目。

var userId = JSON.stringify(req.user._id);
console.log(typeof userId); // >> String

因此,来自用户对象的 userId 和来自项目对象的 user_id 是同一类型:字符串。

可能这真的很愚蠢,但我看不出用户 _id 对象与 items 对象中的 user_id 不匹配的原因。

如何使用来自 _id.$oid 对象的登录用户 ID 获取具有登录用户 ID 的项目?

【问题讨论】:

  • 这意味着您错误地导入了数据。这里的$oid 意味着被翻译成ObjectId BSON 类型,而不是你这里的类型。在核心文档中阅读extended jsonmongoimport 实用程序也可以正确地本地处理此类数据。
  • var userId = req.user._id.toString();解决了!

标签: node.js mongodb express passport.js


【解决方案1】:

当您调用JSON.stringify(req.user._id); 时,您会得到字符串,它是 ObjectID 对象的 JSON 表示形式。它应该是类似于"{ "$oid": "55c772bce97e9a500b3754ae" }" 的东西,它与"55c772bce97e9a500b3754ae" 不同。

要仅获取 ObjectId 的十六进制表示,请使用 req.user._id.toHexString()

顺便说一句,对于文档之间的手动引用,使用实际的 ObjectID 比使用十六进制字符串更有效。原始 ObjectId 为 12 字节,而 24 字符的十六进制字符串为 28 字节。

【讨论】:

  • req.user._id.toHexString() 有效,但 req.user._id.$oid 无效。
猜你喜欢
  • 2017-06-10
  • 1970-01-01
  • 2021-04-15
  • 2011-05-24
  • 2022-01-17
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2012-06-10
相关资源
最近更新 更多