Mongodb - 确保索引记录

时间:2013-11-27 11:00:01

标签: mongodb

是否可以在记录中使用ensureindex而不是整个集合。

例如:我的数据库结构是

{ "_id" : "com.android.hello", 
    "rating" : [    
        [   {   "user" : "BBFE7F461E10BEE10A92784EFDB",     "value" : "4" } ],  
        [   {   "user" : "BBFE7F461E10BEE10A92784EFDB",     "value" : "4" } ] 
    ] 
}

这是一个评级系统,我不希望用户在同一个应用程序(com.android.hello)上多次评级。如果我在user字段上使用ensureindex,则用户只能对一个应用程序进行投票。当我尝试完全投票给另一个应用程序(com.android.hi)时,它说重复键。

3 个答案:

答案 0 :(得分:0)

不,你不能这样做。唯一性仅在每个文档级别强制执行。您需要重新设计架构才能实现上述功能。例如:

{ 
    "_id" : "com.android.hello",
    "rating": {
        "user" : "BBFE7F461E10BEE10A92784EFDB",
        "value" : "4" 
    }
}

然后只存储多个......

(我知道你没有提供完整的文件)

答案 1 :(得分:0)

                      ensureIndex 

创建索引,应用于整个集合。如果您只想要少量记录,则可能必须保留两个集合并在其中一个集合上应用ensureIndex。

答案 2 :(得分:0)

正如@Derick所说,但是不能确保他们只能原子地投票一次:

var res=db.votes.update(
    {_id: 'com.android.hello', 'rating.user': {$nin:['BBFE7F461E10BEE10A92784EFDB']}},
    {$push:{rating:{user:'BBFE7F461E10BEE10A92784EFDB',value:4}}},
    {upsert:true}
);
if(res['upserted']||res['n']>0){
    print('voted');
}else
    print('nope');

我有点担心$pushupsert中不起作用,但我将其视为有效。