6

MongoDB をストレージの形式として使用する Java アプリに取り組んでいますが、問題が発生しました。ユーザーがアプリにコメントを追加すると、そのドキュメントがコメント コレクションに追加され、統計データのアップサートが実行されます。ただし、アップサートは初回のみ追加します (更新後の呼び出しや新しいデータの挿入はありません)。関連するコードは次のとおりです。

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 ) 
}

...そして私の孤独なステータス...

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

統計コレクションで「_id」と「_class」が欠落していることに注意してください。mongo または tomcat のログにエラーが記録されていません。誰かが以前にこの問題に遭遇したことがありますか、または取引が何であるかを知っていますか? ご協力いただきありがとうございます!

注: upsert を削除して統計を正常に追加すると、すべてが正常に追加されます (もちろん、これは単一のエンティティに対して複数の統計を追加するため、望ましくありません)。

4

2 に答える 2

2

クラスに注釈を付けることができると思います@Document(collection = "colName")-今日も同じ問題が発生しました。アップサートは時々本当に奇妙に機能します:私はまだバグを一貫して取得する方法を理解できません。

実際に私が行ったことは回避策(一時的な、単に「機能させる」)を作成し、オブジェクト内の「_id」の存在を確認する必要があり、nullの場合はsaveを使用し、そうでない場合はupdateを使用します。ええ、それは奇妙ですが、それはうまくいきました。

于 2013-02-22T16:37:29.293 に答える