是否可以在记录中使用ensureindex而不是整个集合。
例如:我的数据库结构是
{ "_id" : "com.android.hello",
"rating" : [
[ { "user" : "BBFE7F461E10BEE10A92784EFDB", "value" : "4" } ],
[ { "user" : "BBFE7F461E10BEE10A92784EFDB", "value" : "4" } ]
]
}
这是一个评级系统,我不希望用户在同一个应用程序(com.android.hello)上多次评级。如果我在user
字段上使用ensureindex,则用户只能对一个应用程序进行投票。当我尝试完全投票给另一个应用程序(com.android.hi)时,它说重复键。
答案 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');
我有点担心$push
在upsert
中不起作用,但我将其视为有效。