私は最近、$pull
SpringのData MongoOperationsインターフェースを介してオペレーターを使用しようとしばらく時間を費やしたので、誰かが同様の問題に遭遇した場合に備えて、私の調査結果を共有するとよいと思いました。
だからここに行く...
私はそのような2つのJavaPOJOを持っています:
@Document
public class OutterObject{
private String id;
private String name;
private List<InnerDocument> innerDocs;
//SETTERS - GETTERS Ommited
public class InnerDocument{
private String id;
private String name;
//SETTERS - GETTERS Ommited
これは次のようにMongoコレクションに保存されます:
"_id" : "doc2",
"_class" : "OutterObject",
"name" : "doc2",
"innerDocs" : [{
"_id" : "innerDoc21",
"name" : "innerDoc21"
}, {
"_id" : "innerDoc22",
"name" : "innerDoc22"
}]
$ pull演算子を使用して、name value="innerDoc22"を持つinnerDocコレクション内のすべてのオブジェクトを削除しようとしています。
私はこのようにmongoドライバーを使用してこれを達成する方法を知っています:
List<String> ids =
Arrays.asList("innerDoc22");
BasicDBObject find = new BasicDBObject();
match.put("innerDocs.name",
BasicDBObjectBuilder.start("$in", ids).get());
BasicDBObject update = new BasicDBObject();
update.put(
"$pull",
BasicDBObjectBuilder.start("innerDocs",
BasicDBObjectBuilder.start("name", "innerDoc22").get()).get());
DBCollection col= mongoOperations.getDb().getCollection("outterObject");
col.update(find , update);
SpringのMongoOperationsインターフェイスを使用して同じことを達成しようとしています。これがMongoOperationsインターフェースを使用した私のコードです:
List<String> ids = Arrays.asList("innerDoc22");
Query removeQuery = Query.query(Criteria.where("innerDocs.name").in(ids));
WriteResult wc = mongoOperations.upsert(
removeQuery,
new Update().pull("innerDocs.name", "innerDoc22"),
OutterObject.class);
System.out.println(wc.getLastError());
更新の呼び出しgetLastError()
がデータベースで行われていないだけでも、エラーは発生しません。
同様の質問がすでにここで行われていることは知っていますが、与えられた回答はMongoOperationsインターフェイスを使用していません。