0

Node.jsでMongo/Mongooseを使用してデータをキャッシュしています。Cacheオブジェクトには、多数のCachedPagesが含まれています。言い換えると:

var PageSchema = {
                'source':                    String,
                'data':                     {}
            };
var PageModel = mongoose.model('pages',PageSchema);

var CacheSchema = {
                'last_updated':             Date,
                'pages':                   [PageSchema]
            }
var CacheModel = mongoose.model('caches',CacheSchema);

新しいページデータの配列が入ってくると、最初に新しいオブジェクトごとに新しいCachedPageを挿入してキャッシュします。

var data = new PageModel({'source': page.source, 'data': page.contents});
data.save(function(err){
    // error handling removed
    pages.push(data);
});

最後に、ページを新しいキャッシュに保存します。

var cache = new CacheModel({'last_updated': new Date(), 'pages': pages});
cache.save(...);

ここまでは順調ですね!すべてが適切に保存されます。

ページを更新したいときに問題が発生します。アップサートを実行してPageModelを変更しても、CacheModel内のページのデータには影響しないようです。たとえば、私がそうする場合:

PageModel.update({'_id': id_to_update}, {'data': new_data}, {'upsert': true}, function(...));

次に、ページが更新されても、キャッシュを取得するために「検索」を実行すると、ページの配列には古いデータが反映されたままになります。

CacheSchemaの宣言の一部としてPageSchemaを使用する利点は、ページへの更新がキャッシュ内に反映されるように、オブジェクトがリンクされることであると理解していました。私は何が欠けていますか?

明らかに、CacheSchema.pagesを_idsの配列に変更できます。次に、キャッシュを取得する場合は、PageModelで2番目のクエリを実行して、_idsの配列をオブジェクトの配列に変換します。これで問題は解決しますが、2番目のクエリが追加されます...

ありがとう!

4

1 に答える 1

3

あなたはMongoose/Mongoに埋め込まれたドキュメントの概念を誤解しています。ページドキュメントをキャッシュドキュメント内の配列に埋め込むと、同じ_id値を持つページドキュメントの独立したコピーが作成されます。このスキーマ設計を使用する場合は、コレクション内のドキュメントに加えられた変更が、pagesコレクション内のドキュメントの埋め込みpages配列にも行われるようにする必要がありcachesます。

ここでのより一般的な選択は、前述のようCacheSchema.pagesに_idの配列を作成することですが、必要に応じてMongooseのpopulateサポートを使用して完全なオブジェクトへの参照を追跡します。したがって、次pagesのようになりますCacheSchema

pages: [{ type: Schema.ObjectId, ref: 'pages' }]
于 2012-06-30T02:19:29.397 に答える