2013-11-27 7 views
0

레코드 내에서 ensureindex를 사용할 수 있습니까? 전체 컬렉션에는 사용할 수 있습니까?Mongodb - 레코드 용

예 : 내 데이터베이스 구조는

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

그것은 등급 시스템이며 i는 사용자가 동일한 응용 프로그램 (com.android.hello)에 여러 번 평가하지 않으입니다. user 필드에서 ensureindex를 사용하면 사용자는 하나의 응용 프로그램에서만 투표 할 수 있습니다. 다른 응용 프로그램 (com.android.hi)에 투표하려고하면 중복 키가 표시됩니다.

답변

0

아니요,이 작업을 수행 할 수 없습니다. 고유성은 문서 수준에서만 적용됩니다. 위의 작업을 수행하려면 스키마를 다시 설계해야합니다. 로 예를 들면 :

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

그리고 단지 여러 저장 ...

에 적용되는

0
     ensureIndex 

인덱스를 생성, (난 당신이 비록 전체 문서를 제공하지 않았다 실현) 전체 컬렉션입니다. 적은 수의 레코드 만 원한다면 컬렉션 2 개를 유지하고 컬렉션 중 하나에 ensureIndex를 적용해야 할 수 있습니다. @Derick 말했듯이

0

, 더 그러나 그들이 한 번만 원자 투표를 할 수 있는지 확인 할 수 없습니다 :

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에서 작동하지 않을 것이라고 조금 걱정했지만, 난 작업으로이 테스트.