2015-08-16 66 views
0

我正在嘗試使用登錄用戶標識查找對象。

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:[ 
     //... 
    ] 
} 

它返回空數組,因爲用戶id不匹配user_id說明我猜。當我嘗試設置時:

var userId = '55c772bce97e9a500b3754ae'; 

它返回具有userId的項目。

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

因此,來自用戶對象的userId和來自items對象的user_id是相同的類型:String。

也許這真的是愚蠢的,但我看不出爲什麼用戶_id對象不匹配USER_ID中的項目對象。

如何獲取已登錄用戶標識的項目,使用_id。$ oid對象的登錄用戶標識?

+0

這意味着你錯誤地導入了你的數據。這裏的'$ oid'是**意味着要被轉換成['ObjectId'](http://docs.mongodb.org/manual/reference/object-id/)BSON類型,而不是你在這裏所擁有的。在覈心文檔中閱讀[擴展json](http://docs.mongodb.org/manual/reference/mongodb-extended-json/)。 ['mongoimport'](http://docs.mongodb.org/master/reference/program/mongoimport/)工具也能正確處理這些數據。 –

+0

var userId = req.user._id.toString();解決它thnx! – Mar

回答

1

當你調用​​時,你得到的字符串是一個ObjectID對象的JSON表示。它應該是沿着"{ "$oid": "55c772bce97e9a500b3754ae" }"的行,它不是與"55c772bce97e9a500b3754ae"相同的字符串。

要獲取ObjectId的十六進制表示,請使用req.user._id.toHexString()

順便說一下,對於文檔之間的手動引用,使用實際的ObjectID比使用十六進制字符串更有效。原始ObjectId是12個字節,而24個字符的十六進制字符串是28個字節。

+0

req.user._id.toHexString()有效,但不是req.user._id。$ oid。 – Mar

+0

@Mar糾正。 – Philipp