我有一个这样的架构
模式
{
'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 不再起作用,我应该怎么做才能防止这种情况?
最佳答案
$addToSet 检查整个对象而不是特定值,仅在您的情况下
{ key: 'abc', value:['111'] }
and
{ key: 'abc'}
$addToSet 两者都不同
如果您想确保唯一键,那么您应该为此创建一个唯一索引。
db.collection.ensureIndex( { 'cr.key': 1 }, { unique: true } );
关于mongodb - 即使使用 $addToSet 在 mongodb 的数组中重复键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19446173/