2012-07-24 114 views
113

我有一個Node.js應用程式,拉一些數據,它堅持到一個對象,像這樣:比較貓鼬_id和字符串

var results = new Object(); 

User.findOne(query, function(err, u) { 
    results.userId = u._id; 
} 

當我做了,如果再根據這個存儲的ID /時,

if (results.userId == AnotherMongoDocument._id) { 
    console.log('This is never true'); 
} 

當我做兩個ID的的的console.log,嚴絲合縫:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002 

我一樣比較是不正確的總結這是一種數據類型的問題,但我不知道如何將results.userId轉換爲數據類型,這將導致上述比較爲真,我的外包大腦(又名Google)一直無法提供幫助。

回答

204

貓鼬使用MongoDB的本地驅動程序,它使用自定義的對象ID類型。您可以將ObjectID與.equals()方法進行比較。以你爲例,results.userId.equals(AnotherMongoDocument._id)。 ObjectID類型也有一個toString()方法,如果您希望以JSON格式存儲字符串化的ObjectID版本或cookie。

如果您使用ObjectID = require("mongodb").ObjectID(需要mongodb本機庫),則可以檢查results.userId是否是results.userId instanceof ObjectID的有效標識符。

等等

+7

「.equals()」的文檔:http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html#equals – 2015-03-06 13:31:42

+1

如果您已經在使用'mongoose'可以'require('mongoose')。mongo.ObjectID',所以你不必列出任何額外的依賴 – JoshuaDavid 2017-07-14 19:19:10

48

ObjectID s是對象,所以如果您只是將它們與==進行比較,那麼您正在比較它們的引用。如果要比較它們的值,你需要使用ObjectID.equals方法:

if (results.userId.equals(AnotherMongoDocument._id)) { 
    ... 
} 
3

接受的答案確實限制了你可以用你的代碼做什麼。例如,您將無法使用equals方法搜索Object Ids的數組。相反,總是強制轉換爲字符串並比較鍵是更有意義的。

下面是一個示例答案,如果您需要使用indexOf()來檢查特定ID的引用數組內。假設query是要執行查詢,假設someModel是你正在尋找的ID的蒙戈模型,最後承擔results.idList是你正在尋找在你的對象ID字段。

query.exec(function(err,results){ 
    var array = results.idList.map(function(v){ return v.toString(); }); 
    var exists = array.indexOf(someModel._id.toString()) >= 0; 
    console.log(exists); 
}); 
+1

或單行:'let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length? true:false' – Zlatko 2016-06-07 20:12:54

+2

@Zlatko我不是新語法的忠實粉絲,而是他自己的。 – r3wt 2016-06-10 04:09:03

+0

@Zlatko 'const的存在= results.idList.some(VAL => val.toString()=== thisIsTheStringifiedIdWeAreLookingFor)' 或 'const的存在= results.idList.some(VAL => val.equals (someModel._id))' – Pysul 2018-02-10 01:45:30

4

轉換對象ID字符串(使用toString()方法)將完成這項工作。