Морфия и как обновить существующее поле документа - PullRequest
8 голосов
/ 11 октября 2011

Я совершенно новичок в MongoDb и Morphia и
пытаюсь узнать, как обновить мой документ.

Я не вижу / не понимаю, как это сделать на этой странице:
http://www.mongodb.org

Мой документ выглядит следующим образом: (здесь может быть какая-то ошибка)

@Entity
public class UserData {

    private Date creationDate;
    private Date lastUpdateDate;

    @Id private ObjectId id;
    public String status= "";
    public String uUid= "";


    public UserData() {
        super();
        this.statistic = new Statistic();
        this.friendList = new FriendList();
    }

    @Embedded
    private Statistic statistic;
    @Embedded
    private FriendList friendList;

    @PrePersist
    public void prePersist() {
        this.creationDate = (creationDate == null) ? new Date() : creationDate;
        this.lastUpdateDate = (lastUpdateDate == null) ? creationDate : new Date();
    }
}

На этой странице я не вижу ни одного места, где они описывают, как обновить мой UserData, который имеет определенный uUid
Как update UserData.status, если uUid=123567

Это то, чтоя думаю, что я должен использовать:

ops=datastore.createUpdateOperations(UserData.class).update("uUid").if uuid=foo..something more here..

// Morphia по умолчанию обновление для обновления всех документов UserData, так как обновить выбранные

datastore.update(datastore.createQuery(UserData.class), ops);  

Ответы [ 2 ]

12 голосов
/ 11 октября 2011

Я думаю, это то, что вы хотите:

query = ds.createQuery(UserData.class).field("uUid").equal("1234");
ops = ds.createUpdateOperations(UserData.class).set("status", "active");

ds.update(query, ops);
2 голосов
/ 11 ноября 2011

Интерфейс morphia немного неуклюж, и документы не ясны ... но метод обновления только одного, конкретного документа фактически демонстрируется на странице, на которую ссылался Эрик :

// This query will be used in the samples to restrict the update operations to only the hotel we just created.
// If this was not supplied, by default the update() operates on all documents in the collection.
// We could use any field here but _id will be unique and mongodb by default puts an index on the _id field so this should be fast!
Query<Hotel> updateQuery = datastore.createQuery(Hotel.class).field("_id").equal(hotel.getId());

...

// change the name of the hotel
ops = datastore.createUpdateOperations(Hotel.class).set("name", "Fairmont Chateau Laurier");
datastore.update(updateQuery, ops);

Кроме того, на другой странице документации показывает умногоспособ скрыть этот громоздкий запрос внутри самого класса сущности:

@Entity
class User
{
   @Id private ObjectId id;
   private long lastLogin;
   //... other members

   private Query<User> queryToFindMe()
   {
      return datastore.createQuery(User.class).field(Mapper.ID_KEY).equal(id);
   }

   public void loggedIn()
   {
      long now = System.currentTimeMillis();
      UpdateOperations<User> ops = datastore.createUpdateOperations(User.class).set("lastLogin", now);
      ds.update(queryToFindMe(), ops);
      lastLogin = now;
   }
}
...