5

MongoDBに次のタイプのレコードがあります。

{
    "_id" : ObjectId("50217d8874ebb0e4e52cc07d"),   
    "timestamp" : "8/7/12 1:41:36 PM Pacific Daylight Time",
    "_ts" : ISODate("2012-08-07T20:41:44.119Z")
}

古いレコードを削除するにはどうすればよいですか?のようなものを試しましdb.offlineLogs.remove({timestamp: {$lt:new Date("2012, 8, 3")}});たが、機能しません。

4

3 に答える 3

6

これを使用して解決しました:db.offlineLogs.remove({"_ts":{"$lt":ISODate("2012-08-01T19:30:07.805Z")}});

于 2012-08-07T21:05:22.913 に答える
3

TimeToLiveの使用を確認することもできます。

MongoDBにはTimeToLive、ドキュメントが自動的に削除されるまでにコレクションに存在する期間を指定できる機能があります。

たとえば、次のフィールドを持つbillingという名前のコレクションがあるとします。

{ 
    "_id" : ObjectId("59a05ef17055161ef66e9b21"), 
    "receiptId" : NumberInt(31124124), 
    "salesperson" : "jack", 
    "salesTime" : ISODate("2017-08-25T17:32:23.157+0000")
}

このコレクションには、次のようにインデックスを作成できます。

db.billing.createIndex( { "salesTime": 1 }, { expireAfterSeconds: 3600 });

これにより、salesTimeフィールドに基づいて、コレクション内のすべてのドキュメントが1時間(3600秒)後に削除されます。

于 2017-08-24T23:50:04.333 に答える
1

元のクエリでは、timestampは単なる文字列フィールドでありDate()、Mongoシェルでは文字列として扱われます。これらのオペランドの比較は、他の文字列比較と同じように機能します。

$ mongo
MongoDB shell version: 2.2.0-rc1-pre-
connecting to: test
> db.foo.drop()
true
> db.foo.insert({ x: Date() });
> db.foo.find()
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> sleep(1000)
null
> db.foo.find({ x: { $lt: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.find({ x: { $gt: Date() }});
> 

ISODate()Mongoの日付フィールド$gtに相当するJSであり、 or$lt演算子を使用する場合の文字列値とは比較できません。

> db.foo.find({ x: { $gt: ISODate() }});
> db.foo.find({ x: { $lt: ISODate() }});
> db.foo.find({ x: { $ne: ISODate() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.insert({x: ISODate() });
> db.foo.find({ x: {$gt: Date() }});
> db.foo.find({ x: {$lt: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
> db.foo.find({ x: {$ne: Date() }});
{ "_id" : ObjectId("50218e808930273947a21cf3"), "x" : "Tue Aug 07 2012 17:54:09 GMT-0400 (EDT)" }
{ "_id" : ObjectId("50218fa18930273947a21cf4"), "x" : ISODate("2012-08-07T21:58:57.350Z") }
>

Mongoは、文字列が日付の前に来るタイプ間の比較順序を定義しますが、同じフィールドがコレクション全体で異なるタイプを持つ可能性がある場合の並べ替え順序に関連しています。

自分が頻繁に行うことを想定している場合(バッチプロセスなど)に古いレコードを削除する場合は、次の2.2リリースの新機能であるTTLコレクションに関心がある可能性があることに注意してください。Kristina Chodorowも、このブログエントリでこのトピックに関する面白い紹介を書きました。

于 2012-08-07T22:05:41.177 に答える