1

RavenDB でドキュメントを同期する最も効率的な方法は何ですか?

外部ソースからIEnumerable、次のことを行いたい BlogPosts を取得します。

  • RavenDB に新しいオブジェクトを追加する
  • 既存のオブジェクトを更新する
  • 外部ソースで削除されたオブジェクトを削除します

実装が必要なコード:

public void SyncIntoRaven(IEnumerable<BlogPost> postsToSync, IDocumentStore store) {
    // TODO: Implement
    // AddNewItems(postsToSync);

    // TODO: Implement
    // RemoveDeletedItems(postsToSync);

    // TODO: Implement
    // UpdateExistingItems(postsToSync);
}

RavenDB からすべての BlogPost を取り出してローカルで同期し、すべての変更をプッシュすることもできますが、 RavenDB へのトラフィックを最小限に抑えたいと考えています。しかし、それも正しいアプローチではないでしょうか?

4

2 に答える 2

1

synhershkoの説明フォームの助けを借りて、私はそれを理解し、概念を示すために単純化されたコードを共有したいと考えました。

private void RefreshBlogPosts(IDocumentSession session, IList<BlogPost> parsedPosts) {
    var parsedPostsIds = parsedPosts.Select(x => x.Id);
    var storePosts = session.Load<BlogPost>(parsedPostsIds);

    // Update existing or create new posts
    for(int i = 0; i < storePosts.Count(); i++) {
        var parsedPost = parsedPosts[i];

        var storePost = storePosts[i];
        if(storePost == null) {
            storePost = parsedPost;

            session.Store(storePost);
        } else {
            // Update post's properties
        }
    }

    // Find posts IDs no longer in database
    var removedPostIds = session.Query<BlogPost>().Select(x => x.Id)
        .Where(postId => !parsedPostsIds.Contains(postId));

    foreach(var removedPostId in removedPostIds) {
        session.Advanced.Defer(new DeleteCommandData() { Key = removedPostId });
    }

    session.SaveChanges();
}    
于 2012-06-15T20:57:00.653 に答える
1

外部ソースと RavenDB の間で同じ ID を共有している場合、これは ACID 方式で 1 ​​つのトランザクション内で非常に簡単に行うことができます。

同期操作の間に変更された ID を追跡し、ID のリストを取得したら、これを簡単に行うことができます。

セッションを開き、session.Store() を使用して新しいドキュメントを追加し、session.Load(string[]) session.Load() を使用して更新または削除が必要なすべてのドキュメントをロードし、遅延オプションを使用して更新 (および削除) を行います。 )、完了したら、session.SaveChanges() を呼び出します。

それはあなたをカバーし、サーバーへの1回のラウンドトリップで発生するはずです.

いずれにせよ、毎回完全な同期を行う必要はありません。常にデルタを使用する必要があります。

于 2012-06-13T18:31:32.043 に答える