2014-01-26 149 views
0

我在節點js中工作,並使用mongo(Im絕對初學者)即時通訊。現在我需要收集,基本上需要這個樣子陣列檢查mongo集合中是否存在值

var keys = ['key1','key2','key3'] //這個我,如果某個值我有這個陣列的indexOf功能的存在可以輕鬆地檢查,

現在我需要收集在mongo中只需要存儲用戶創建的密鑰,如果密鑰已經存在於集合中,它就不需要做任何事情。

//我的鑰匙看起來是這樣的,它可以是一個字符串,也可以是一個字符串數組

Keys = 'home4.car3' or Keys = ['home4.car3','home2.car4'] 

//林這樣

db.collection('keys',function(err, collection){ 
      collection.insert(Keys, {safe:true}, function(err, result) { 
       if (err) { 
        res.send({'error':'An error has occurred'}); 
       } else { 
        console.log("success"); 
       } 
      }); 
     }); 

現在,這裏做的是插入當我第一次插入兩個密鑰數組到db,然後在那之後一個字符串時會發生什麼:

https://gist.github.com/anonymous/fc7730e398519cffde3f

有沒有人可以告訴我如何插入此以及如何篩選這些密鑰以檢查它們是否屬於集合?

回答

3

首先,如果您像存儲數組一樣存儲文檔,爲什麼不將它們作爲數組存儲?如果你來自關係數據庫背景,我可以看到你如何試圖以這種方式存儲它,但在Mongo中,如果它像一個數組,它應該只是作爲一個數組存儲。

{ 
    "_id" : ObjectId("52e5361f30f28b6b602e4c7f"), 
    "0" : "h", 
    "1" : "o", 
    "2" : "m" 
} 

應該是:

{ 
    "_id" : ObjectId("52e5361f30f28b6b602e4c7f"), 
    "keys" : [ "h", "o", "m" ] 
} 

在這種情況下,蒙戈有一個方便的操作稱爲$addToSet,將工作類似,只是,如果它不存在,它只會把它添加到陣列$push 。聯合國行動將是這個樣子:

collection.update(query, { $addToSet : { 'keys' : 'l' }}, callback); 
// add key 'l' 

collection.update(query, { $addToSet : { 'keys' : 'm' }}, callback); 
// looks in document, sees 'm' in array, and does nothing 

編輯:

更新後,它將項添加到數組,如果它不存在,但或者,如果你只是想知道,如果它的存在不,我認爲最好的辦法是使用findOne

// find the doc by _id and the value you want in keys, returns null if it's not a match 
collection.findOne({ _id : 52e5361f30f28b6b602e4c7f, 'keys' : 'l' }, function(err, doc) { 
    if(doc == null) { 
     // do whatever you need to do if it's not there 
    } else { 
     // do whatever you need to if it is there 
    } 
    db.close(); 
} 

爲了讓您的插入爲是,你只需要改變Keys到:

Keys = { 'keys' : [ 'key1', 'key2', 'key3' ] }; 

而插入不需要另外改變。此外,在您的收藏中,您可能需要將_id更改爲username或將username字段添加到您的文檔。

+0

如何獲取事件,如果它不在數組中,因爲我需要觸發該事件的功能?你能告訴我如何插入現在看起來像 – user3237500

+0

非常感謝! :) – user3237500

+0

沒問題!如果您的問題已成功解答,請接受答案。 – EmptyArsenal

相關問題