我正在尝试查找具有登录用户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的项目?
答案 0 :(得分:1)
当你调用JSON.stringify(req.user._id);
时,你得到的字符串是ObjectID对象的JSON表示。它应该是"{ "$oid": "55c772bce97e9a500b3754ae" }"
的一行,与"55c772bce97e9a500b3754ae"
的字符串不同。
要获得ObjectId的十六进制表示,请使用req.user._id.toHexString()
。
顺便说一下,对于文档之间的手动引用,使用实际的ObjectID比使用hex字符串更有效。原始ObjectId为12字节,而24字符十六进制字符串为28字节。