即使使用$ addToSet,mongodb中的数组中的密钥重复

时间:2013-10-18 09:29:37

标签: mongodb mongoose

我有这样的架构 架构

{
    'cr':[
              { key: 'key1', value:['value1','value2','value3'] },
              { key: 'key2', value:['value4','value5','value6'] }
         ]
}

function addCriteriaKey(id,key,callback){
    var options = { new: false ,select:'_id'};
        Model.update({'uid':id},{'$addToSet':{'cr':{'key':key}}},options,function(err,data){
           if(err) callback(err,null);
           else callback(null,data);
        })  
}

function addCriterialValueToKey(id,key,value,callback){
    var options = { new: false ,select:'_id'};
        Model.update({'uid':id,'cr.key':key},{'$addToSet':{'cr.$.val':value}},options,function(err,data){
            if(err) callback(err,null);
            else callback(null,data);
        })  
}

所以这是我添加一个键并添加一个值的两种方法,它们都可以工作,但数据库有一个现有的键,但我添加了一个额外的键,$ addToSet不再工作了。

例如 当我这样做的时候:

1。 addCriteriaKey('id','abc',function(err,data){})

2. addCriterialValueToKey('id','abc','111',function(err,data){})

数据变得像

{
    'cr':[
              { key: 'abc', value:['111'] }              
         ]
}

但是当我再次添加键'abc'时。 1. addCriteriaKey('id','abc',function(err,data){})

数据变得像

{
    'cr':[
              { key: 'abc', value:['111'] },
              { key: 'abc' }                
         ]
}

似乎$ addToSet不再起作用了,我应该做些什么来防止这种情况?

1 个答案:

答案 0 :(得分:6)

$ addToSet仅在您的情况下检查整个对象而不是特定值

{ key: 'abc', value:['111'] } 
and
{ key: 'abc'}

$ addToSet

两者都不同

如果你想确保唯一密钥,那么你应该为此创建一个唯一索引。

db.collection.ensureIndex( { 'cr.key': 1 }, { unique: true } );