2017-01-05 1 views
-1

우리의 앱에는 mongoDB 데이터베이스에 연결된 사용자 모델이 있습니다. 내 질문에 대한 주어진 사용자 데이터 (물론 사용자 ID를 사용하여) 내에서 키/값 쌍의 값을 수정 에 대한 것입니다.MongoDB와 Asp Core는 전체 모델 대신 키 : 값 쌍만 업데이트합니다.

우리의 응용 프로그램에
public class User 
    { 
     [BsonId] 
     public string Id { get; set; } 
     public string email { get; set; } = string.Empty; 
     public bool hasAcceptedTerms { get; set; } = false; 
     public int state { get; set; } = 0; 
     public int UserId { get; set; } = 0; 
     public IList<UserFile> SubmittedFiles { get; set; } 
    } 
    public class UserFile 
    { 
     public int fileID { get; set; } 
     public bool hasFile { get; set; } 
    } 

후 첫 로그인 후, 우리가 사용 몽고 데이터베이스에 자신의 항목을 만들

public async Task AddUser(User item) 
     { 
      await _context.Users.InsertOneAsync(item); 
     } 

을 처음으로 사용자를 인증 : 여기

내 간단한 모델입니다 우리는 그가 수락 한 사실을 업데이트하고 싶습니다. 이렇게함으로써 hasAcceptedTermstrue으로 변경하고 state 키를 0에서 1으로 옮기고 싶습니다. 우리의 저장소에서 잠시 동안

우리는 같은 것을 가지고

public async Task<UpdateResult> UpdateUser(string id, User item) 
{ 
    return await _context.Users 
         .ReplaceOneAsync(n => n.Id.Equals(id) 
              , item 
              , new UpdateOptions { IsUpsert = true }); 
} 

을하지만, 그렇게함으로써 우리는 우리의 모델에 해당하는 모든 항목을 제공해야합니다. 그의 OBJECTID ID로 식별되는 사용자에 대한 올바른 값을 수정하는 것입니다 예를 호출 UpdateUserData('user1objectidhash', 'hasAcceptedTerms', true)를 들어

UdateUserData(string id, string data, bool newvalue); 

:

내가처럼 사용할 수있는 함수를 만들 수있는 방법을 찾을 수 없습니다.

  • 첫 번째 문제 : 는/독특한 솔루션 좋은 생각 stringdata를 입력됩니다? 데이터 키를 문자열로 입력하면 내 함수 호출이 우아하지 않습니다.
  • 2nd : 내가 수정하고 싶은 데이터가 무엇인지에 따라 달라 지므로 newvalue의 유형이 무엇인지 알 수 없습니다. 모델에서 감지 할 수 있습니까?
  • 3rd : 이 업데이트를 처리 할 수있는 올바른 Mongo.Driver 기능을 알지 못합니다.

몇 가지 힌트와 조언을 제공해 주시겠습니까?

+0

가능성과 의미 것을, 당신의 IMongoCollection<User>입니다 [mongoDb 및 asp.net 코어의 업데이트 작업]의 복제본 (http://stackoverflow.com/questions/41483648/update-operation-in-mongodb-and-asp-net-core) – Tseng

+0

검색 기능 사용 방법은 어떻습니까? 몇 시간 전에 ** 정확한 ** 질문에 답했습니다. – Tseng

답변

1

것은 당신이 그냥 전체 개체를 업데이트 할 만 가능하다고 일부 속성이 Update 명령 할 경우

collection.UpdateOneAsync(x=>x.Id ==id, 
     Builders<User>.Update.Set(u=>u.hasAcceptedTerms, false) 
          .Set(u=>u.state, 1)); 

내가 가정을, 그 컬렉션은 _context.Users