转载自::https://blog.csdn.net/small_love/article/details/6628200
-
interface Datastore {
-
…
-
-
-
/** updates all entities found with the operations*/
-
UpdateResults update(Query query, UpdateOperations ops) ;
-
/** updates all entities found with the operations; if nothing is found insert the update as an entity if “createIfMissing” is true*/
-
UpdateResults update(Query query, UpdateOperations ops, boolean createIfMissing) ;
-
/** updates the first entity found with the operations*/
-
UpdateResults updateFirst(Query query, UpdateOperations ops) ;
-
/** updates the first entity found with the operations; if nothing is found insert the update as an entity if “createIfMissing” is true*/
-
UpdateResults updateFirst(Query query, UpdateOperations ops, boolean createIfMissing) ;
-
/** updates the first entity found with the operations; if nothing is found insert the update as an entity if “createIfMissing” is true*/
-
UpdateResults updateFirst(Query query, T entity, boolean createIfMissing) ;
-
}
-
public
interface UpdateOperations<T> {
-
/** sets the field value */
-
UpdateOperations
set(String fieldExpr, Object value) ;
-
/** removes the field */
-
UpdateOperations
unset(String fieldExpr) ;
-
-
-
/** adds the value to an array field*/
-
UpdateOperations
add(String fieldExpr, Object value) ;
-
UpdateOperations
add(String fieldExpr, Object value, boolean addDups) ;
-
/** adds the values to an array field*/
-
UpdateOperations
addAll(String fieldExpr, List> values, boolean addDups) ;
-
-
/** removes the first value from the array*/
-
UpdateOperations
removeFirst(String fieldExpr) ;
-
/** removes the last value from the array*/
-
UpdateOperations
removeLast(String fieldExpr) ;
-
/** removes the value from the array field*/
-
UpdateOperations
removeAll(String fieldExpr, Object value) ;
-
/** removes the values from the array field*/
-
UpdateOperations
removeAll(String fieldExpr, List> values) ;
-
-
-
/** decrements the numeric field by 1*/
-
UpdateOperations
dec(String fieldExpr) ;
-
/** increments the numeric field by 1*/
-
UpdateOperations
inc(String fieldExpr) ;
-
/** increments the numeric field by value (negatives are allowed)*/
-
UpdateOperations
inc(String fieldExpr, Number value) ;
-
}
-
Morphia morphia =
new Morphia();
-
morphia.map(Hotel.class).map(Address.class);
-
Datastore datastore = morphia.createDatastore(
“MorphiaSampleDb”);
-
Hotel hotel =
new Hotel(
“Fairmont”,
3,
new Address(
“1 Rideau Street”,
“Ottawa”,
“K1N8S7”,
“Canada”));
-
datastore.save(hotel);
-
UpdateOperations
ops;
-
-
// 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
updateQuery = datastore.createQuery(Hotel.class).field(
“_id”).equal(hotel.getId());
-
-
// The Mapper class also provides a public static of the default _id field name for us…
-
Query
updateQuery = datastore.createQuery(Hotel.class).field(Mapper.ID_KEY).equal(hotel.getId());
-
@Entity(
“hotels”)
-
public
class Hotel
-
{
-
@Id
-
private ObjectId id;
-
-
-
private String name;
-
private
int stars;
-
-
-
@Embedded
-
private Address address;
-
-
-
@Embedded
-
List
roomNumbers =
new ArrayList();
-
-
-
// … getters and setters
-
}
-
-
-
@Embedded
-
public
class Address
-
{
-
private String street;
-
private String city;
-
private String postalCode;
-
private String country;
-
-
-
// … getters and setters
-
}
-
// 改变Hotel的name属性值
-
ops = datastore.createUpdateOperations(Hotel.class).set(
“name”,
“Fairmont Chateau Laurier”);
-
datastore.update(updateQuery, ops);
-
-
//也可以操作嵌套文档, 改变address的city属性值
ops = datastore.createUpdateOperations(Hotel.class).set("address.city", "Ottawa");
-
datastore.update(updateQuery, ops);
-
-
// 删除Hotel的name属性值
-
// 当下会访问Hotel时name属性为null
-
ops = datastore.createUpdateOperations(Hotel.class).unset(
"name");
-
datastore.update(updateQuery, ops);
-
// ‘stars’属性增长一
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”);
-
datastore.update(updateQuery, ops);
-
-
// ‘stars’属性值增长4
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”,
4);
-
datastore.update(updateQuery, ops);
-
-
// ‘stars’属性值减少1
-
ops = datastore.createUpdateOperations(Hotel.class).dec(
“stars”);
// 和 .inc(“stars”, -1) 相同
-
datastore.update(updateQuery, ops);
-
-
// ‘stars’属性值减少4
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”, -
4);
-
datastore.update(updateQuery, ops);
-
// 把一个值放入到数组中 array() (+v 0.95)
-
// same as .add(“roomNumbers”, 11, false)
-
ops = datastore.createUpdateOperations(Hotel.class).add(
“roomNumbers”,
11);
-
datastore.update(updateQuery, ops);
// [ 11 ]
当在一个不是数组的属性上进行数组操作时MongoDB将会抛出错误。
-
ops = datastore.createUpdateOperations(Hotel.class).set(
“roomNumbers”,
11);
-
datastore.update(updateQuery, ops);
-
-
// 由于没有rooNumbers数组将会引起错误
-
ops = datastore.createUpdateOperations(Hotel.class).add(
“roomNumbers”,
11,
false);
-
datastore.update(updateQuery, ops);
// causes error
-
-
// 删除roomNummbers属性
-
ops = datastore.createUpdateOperations(Hotel.class).unset(
“roomNumbers”);
-
datastore.update(updateQuery, ops);
-
-
// use the 3rd parameter to add duplicates
-
-
// add to end of array, same as add()
-
ops = datastore.createUpdateOperations(Hotel.class).add(
“roomNumbers”,
11,
false);
-
datastore.update(updateQuery, ops);
// [ 11 ]
-
-
// no change since its a duplicate… doesn’t cause error
-
ops = datastore.createUpdateOperations(Hotel.class).add(
“roomNumbers”,
11,
false);
-
datastore.update(updateQuery, ops);
// [ 11 ]
-
-
// push onto the end of the array
-
ops = datastore.createUpdateOperations(Hotel.class).add(
“roomNumbers”,
12,
false);
-
datastore.update(updateQuery, ops);
// [ 11, 12 ]
-
-
// add even if its a duplicate
-
ops = datastore.createUpdateOperations(Hotel.class).add(
“roomNumbers”,
11,
true);
-
datastore.update(updateQuery, ops);
// [ 11, 12, 11 ]
-
//given roomNumbers = [ 1, 2, 3 ]
-
ops = datastore.createUpdateOperations(Hotel.class).removeFirst(
“roomNumbers”);
-
datastore.update(updateQuery, ops);
// [ 2, 3 ]
-
-
-
//given roomNumbers = [ 1, 2, 3 ]
-
ops = datastore.createUpdateOperations(Hotel.class).removeLast(
“roomNumbers”);
-
datastore.update(updateQuery, ops);
// [ 1, 2 ]
-
ops = datastore.createUpdateOperations(Hotel.class).removeLast(
“roomNumbers”);
-
datastore.update(updateQuery, ops);
// [ 1 ]
-
ops = datastore.createUpdateOperations(Hotel.class).removeLast(
“roomNumbers”);
-
datastore.update(updateQuery, ops);
// [] empty array
-
-
-
//given roomNumbers = [ 1, 2, 3, 3 ]
-
ops = datastore.createUpdateOperations(Hotel.class).removeAll(
“roomNumbers”,
3);
-
datastore.update(updateQuery, ops);
// [ 1, 2 ]
-
-
//given roomNumbers = [ 1, 2, 3, 3 ]
-
ops = datastore.createUpdateOperations(Hotel.class).removeAll(
“roomNumbers”, Arrays.asList(
2,
3));
-
datastore.update(updateQuery, ops);
// [ 1 ]
-
//设置城市名称为Ottawa和是stars的增长1
-
ops = datastore.createUpdateOperations(Hotel.class).set(
“city”,
“Ottawa”).inc(
“stars”);
-
datastore.update(updateQuery, ops);
-
-
//如果你在同一个属性上执行多次同样的指令操作,结果将会变化,即:只有最后一次有效
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”,
50).inc(
“stars”);
//stars只增长1
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”).inc(
“stars”,
50);
//stars只增长50
-
-
//你不能在同一个属性上执行相矛盾的操作。
-
ops = datastore.createUpdateOperations(Hotel.class).set(
“stars”,
1).inc(
“stars”,
50);
//引起错误
updateFirst方法
在默认的驱动和shell上这是默认的行为。在Morphia中我们认为修改所有的符合条件的结果是最好的默认选择(如下)。
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”,
50);
-
-
// (+v 0.95 now takes into account the order())
-
// morphia 执行updateFirst方法仅仅执行第一个符合查询条件的数据项
-
datastore.updateFirst(datastore.find(Hotel.class).order(
“stars”), ops);
//仅仅修改Last Chance
-
datastore.updateFirst(datastore.find(Hotel.class).order(
“-stars”), ops);
// 仅仅修改 Fairmont
-
//default shell version is to match first
-
//shell version has a multi to indicate to update all matches, not just first
-
//to mimic morphia operation, set multi = false
-
db.collection.update( criteria, objNew, upsert, multi );
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”,
50);
-
-
// morphia 默认的update是修改所有的Hotels
-
datastore.update(datastore.createQuery(Hotel.class), ops);
//所有的hotel都会增长
-
//equivalent morphia shell version is... upsert = false, multi = true
-
db.collection.update( criteria, objNew,
false,
true );
createIfMissing (overload parameter)
-
ops = datastore.createUpdateOperations(Hotel.class).inc(
“stars”,
50);
-
-
//修改, 如果没有找到就添加一个。
-
datastore.updateFirst(datastore.createQuery(Hotel.class).field(
“stars”).greaterThan(
100), ops,
true);
-
-
// creates { “_id” : ObjectId(“4c60629d2f1200000000161d”), “stars” : 50 }
-
//equivalent morphia shell version is… upsert = true
-
db.collection.update( criteria, objNew,
true, multi );
英语水平有限,敬请大侠 斧正