2012-11-20 4 views
6

MongoDBをストレージの形式として使用するJavaアプリケーションで作業していましたが、問題が発生しました。ユーザーがアプリでコメントを追加すると、コメントコレクションにドキュメントが追加され、統計データのアップカウントが実行されます。ただし、upsertは最初の時刻を追加するだけです(更新後の呼び出しも新しいデータの挿入もありません)。ここでは、関連するコードは次のとおりです。Java MongoTemplate:UpsertsがObjectIdを生成しない

public class CommentDAO implements ICommentDAO { 

    @Autowired 
    @Qualifier(value = "mongoDB") 
    MongoTemplate mongoTemplate; 

    public UserComment addComment(UserComment userComment) { 
     updateStats(userComment, 1L); 
     mongoTemplate.save(userComment); 
     return userComment; 
    } 

    public void updateStats(UserComment userComment, Long offset) { 
     Update update = new Update(); 
     update.inc("total", offset); 
     Query query = query(where("entity").is(userComment.getEntity())); 

     WriteResult wr = mongoTemplate.upsert(query, update, CommentStat.class); 
    } 
} 

は、ここに私のコメントのコレクション内の結果の一例です:

{ 
    "_id" : ObjectId("50ab0566e4b0ea8f74b82d48"), 
    "_class" : "com.test.models.comment.UserComment", 
    "userId" : 4, 
    "ownerId" : 3, 
    "comment" : "Test comment", 
    "type" : "ART", 
    "entity" : "759446489112216656", 
    "date" : Date(1353385318079) 
}, 
{ 
    "_id" : ObjectId("50ab0691e4b0775cf7daacad"), 
    "_class" : "com.test.models.comment.UserComment", 
    "userId" : 4, 
    "ownerId" : 3, 
    "comment" : "Another test", 
    "type" : "ART", 
    "entity" : "759446489112216656", 
    "date" : Date(1353385617619) 
} 

...と私のシングル、孤独のstat ...

{ 
    "entity" : "759446489112216656", 
    "total" : 1 
} 

お知らせstatコレクションに "_id"と "_class"がありません。私はmongoやtomcatのログに何のエラーも出ません。誰もがこの問題にぶつかる前に、または取引が何であるか知っていますか?ご協力いただきありがとうございます!

注: 私はアップサートを削除し、通常のstatを追加した場合、すべてが正常追加(これは、当然のことながら、望ましいことではない単一のエンティティのための複数の統計情報が追加されます)

+0

実行しているMongoDBのバージョンと統計情報の詳細について教えてください。 db.statistics.stats()を実行して、コレクション名に "statistics"を代入することで、mongoシェルでコレクションの要約を表示することができます。 –

+0

statコレクションからあなたのエントリをどのように出力しましたか? ObjectId()を使わずにMongoDBに挿入することはできないでしょう - これはupsertの前にJava POVから見えますか? –

答えて

2

私はあなたを考えます@Document(collection = "colName")であなたのクラスに注釈を付けることができました - 私は今日同じ問題を抱えていました。 Upsertsは時々本当に変です:私はまだバグを一貫して得る方法を考え出すことができません。

実際に私がやったことは、オブジェクト内の "_id"の有無をチェックしなければならない一時的なもの(一時的なもの)であり、ヌルの場合は保存します。更新プログラムを使用します。うん、変だけど、うまくいった。

0

私はすでにIDを持っていたオブジェクトを更新していたので、_idが保存されていたという問題がありました。ただし、_classは保存されませんでした。私の回避策はクラスにメンバーを追加して、_classデータが常にそこにあることを確認することでした:

@Field("_class") 
protected String _class = Foo.class.getName();