2

この投稿で説明されているように、(ドキュメント間の差異の保存に基づいて)バージョン管理をMongoDBに実装しようとしています:MongoDBでデータのバージョン管理を実装する方法

これまで同じアプローチを使用していますが、「Date1とDate2の間のすべての変更を教えてください」のようなクエリを作成したいと思います。投稿に示されているスキーマは、この種のクエリを許可しない変更のキーとして、単純な増分番号を使用しています。

{
    _id : "id of address book record",
    changes : { 
                1234567 : { "city" : "Omaha", "state" : "Nebraska" },
                1234568 : { "city" : "Kansas City", "state" : "Missouri" }
    }
}

私の唯一の推測は、時間ベースのクエリを作成するには、キー値に時間情報を含める必要があるということです。おそらく、次のようなObjectIdまたはISODateです。

{
    _id : "id of address book record",
    changes : { 
                ISODate(Date) : { "city" : "Omaha", "state" : "Nebraska" },
                ObjectId(id) : { "city" : "Kansas City", "state" : "Missouri" }
    }
}

私は解決策をかなり長い間グーグルで検索しましたが、本当に役立つものは何も見つかりませんでした。誰かがこれを行う方法についてアイデアを持っているなら、あなたが私を助けてくれるならそれは素晴らしいことです。これは問題に取り組むための完全に間違った方法であり、この問題を解決するためのより良い方法があるかもしれません...私はどんな提案にもオープンです!

私を助けてくれてありがとう...

4

1 に答える 1

3

バージョン管理にIsoDate(または単純なDate)を使用することは良いアプローチです。ただし、効率的に検索するには、フィールド識別子として使用するのではなく、配列を変更して、この配列のサブドキュメントに日付を入力する必要があります。

{
    _id : "id of address book record",
    changes : [ 
                { "change_date": ISODate(Date), "city" : "Omaha", "state" : "Nebraska" },
                { "change_date": ISODate(Date), "city" : "Kansas City", "state" : "Missouri" }
    ]
}

これにより、$gteまたは$lteを使用したクエリにchanges.change_dateフィールドを使用できます。$maxまた、集計グループ化演算子を使用して最新のものを見つけることもできます( $ maxクエリ演算子と混同しないでください。これはまったく異なることを行います)。

これらのクエリを高速化するために、changes.change_dateにインデックスを追加することもできます。

于 2013-03-27T14:05:10.180 に答える