2013-10-18 52 views
2

我有這樣 模式架構

{ 
    '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',功能(ERR,數據){})

2. addCriterialValueToKey( 'ID', 'ABC', '111',功能(ERR,數據){})

數據變得像

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

但是當我再次添加鍵'abc'時。 1. addCriteriaKey( '身份證', 'ABC',函數(ERR,數據){})

數據變得像

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

似乎$ addToSet不工作了,我應該做什麼來防止這種情況?

回答

5

$ addToSet檢查整個對象不是perticular值只有這樣,你的情況

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

都是不同的$ addToSet

如果你想確保唯一的密鑰,那麼你應該創建唯一索引像這樣。

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

謝謝,Shreyance,這有助於很多 – user824624

+0

@ user824624如果解決了您的目的,您可以接受答案。謝謝:) –