2016-03-20 49 views
1

我在一个集合中存储一个item(stringId)的数组。此数组中的所有元素必须是唯一的。所以我使用$ addToSet来推送我的物品。添加唯一到阵列并保持字段计数更新

但是,我也想在相同的请求来设置我的阵列中的场的尺寸:

{ 
    unique_array: ['12', '20', '18'], 
    size_of_array: 3 
} 

=>添加到组15

{ 
    unique_array: ['12', '20', '18', '15'], => Add to set 
    size_of_array: 4 => Incremented 
} 

=>添加到设置18

{ 
    unique_array: ['12', '20', '18', '15'], => Already in the set 
    size_of_array: 4 => Not incremented 
} 

谢谢!

回答

2

对于这种类型的操作,你不应该使用$addToSet因为当然$inc会不管什么是否被添加到阵列(“设置”)或不发生。

相反,测试与$ne运营商在查询中的数组:

db.collection.update(
    { "unique_array": { "$ne": 18 } }, <-- existing element 
    { 
     "$push": { "unique_array": 18 }, 
     "$inc": { "size_of_array": 1 } 
    } 
) 

这同样适用于去除数组成员,当然你测试与平等存在这个时间:

db.collection.update(
    { "unique_array": 18 }, <-- existing element 
    { 
     "$pull": { "unique_array": 18 }, 
     "$inc": { "size_of_array": -1 } 
    } 
) 

由于查询条件需要匹配,如果数组元素在添加时已经存在,则不存在匹配,并且运行$push$inc操作。 $pull这个元素不在数组中的情况也是如此。

+0

完美。谢谢。 – jeremieca

相关问题