我在节点js工作,我正在使用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
是否有人可以告诉我如何为此插入以及如何过滤这些键以检查它们是否已收集?
答案 0 :(得分:4)
首先,如果您将文档存储为数组,为什么不将它们存储为数组呢?如果你来自关系数据库背景,我可以看到你如何以这种方式存储它,但在Mongo中,如果它像一个数组,它应该只是存储为一个数组。
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"0" : "h",
"1" : "o",
"2" : "m"
}
应该是:
{
"_id" : ObjectId("52e5361f30f28b6b602e4c7f"),
"keys" : [ "h", "o", "m" ]
}
在这种情况下,Mongo有一个名为$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
字段。