2014-01-26 107 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

相关问题