如何使用_id。$ oid对象从mongodb获取数据?

时间:2015-08-16 15:08:35

标签: node.js mongodb express passport.js

我正在尝试查找具有登录用户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"
}

物品对象是这样的:

{
    "_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和来自items对象的user_id是相同的类型:String。

这可能是非常愚蠢的,但我无法看到用户 _id 对象与items对象中的 user_id 不匹配的原因。

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

1 个答案:

答案 0 :(得分:1)

当你调用JSON.stringify(req.user._id);时,你得到的字符串是ObjectID对象的JSON表示。它应该是"{ "$oid": "55c772bce97e9a500b3754ae" }"的一行,与"55c772bce97e9a500b3754ae"的字符串不同。

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

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