2011-11-21 6 views
27

トピックの「バンプ」機能を実装します。トピックがバンプされると、新しい「バンプ日」フィールドが表示されます。私は "bump_date"フィールドがある場合、それが "作成された"フィールドであるかのようにソートされるようにソートする必要があります。MongoDBソート

{ 
    "text" : "test 1", 
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 2", 
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 3", 
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
} 

は私がしたいように行われている「テスト1」の順に返すように並べ替え、「テスト3」、「テスト2」のMongoDBにソート

+0

MongoDBのソートに役立つかもしれないhttp://www.code-sample.com/2016/07/mongodb-sort-by-date.html –

答えて

69

:ここに私のdb.topicsの例です。そう:

db.collection.find({ ... spec ... }).sort({ key: 1 })

1が上昇して-1が下降されます。

具体例:db.topics.find().sort({ bump_date: 1 })ですが、「updated_at」のようなものを呼び出すほうがよいかもしれません。

また、「bump_date」フィールドにインデックスを挿入することも間違いありません。

+2

これが期待通りに機能するためには、私はOPで '最初に文書を保存するときに「bump_date」から「created」に変更されます。それで、あなたは、あなたが提案するように、常に 'bump_date'で並べ替え、インデックスを作成します。 – dcrosta

+1

これは当てはまりますが、コレクションが最終的に圧縮されるように作成する必要があります。または、[スパースインデックス](http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes) –

2

は、現在はMongoDBの中に複数のcolumns.egを超えるユーザーが定義した基準に基づいて並べ替えを行うことはできません。ここでの機能は、それが設定されている場合は、ここで述べたように、サーバー側またはクライアント側のコードを使用する必要がありますどちらかcreated

を返す他に、bump_dateを返すようにされているでしょう:

Mongo complex sorting?

かあなたは基本的キシにしてソートして滞在したい場合は、あなたがしなければならない。新しいレコードが作成されるたびに

  • createdと同等のキーbump_dateを作成します。これはではなく、はデータのオーバーヘッドになります。将来的にはあなたの話題がいつでも突然現れると期待できるので、最終的にbump_dateフィールドが追加されます。開始からそれを追加してください。

  • 記事がバンプされるたびに、フィールドbump_dateを更新してください。

あなたの例の文書は、この変更を次のようになります。

{ 
    "text" : "test 1", 
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 2", 
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 3", 
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
} 

あなたはならensureIndexをbump_dateフィールド上。これで、必要なデータを簡単に照会できます。

db.topics.find().sort({ bump_date: 1 }) 
+0

なぜbump_dateにensureIndexを適用する必要がありますか? –

5

Brian Hicksが示唆しているように、追加のupdated_atフィールドを作成する方法があります。このようにして、ドキュメントが作成されると、created_atとupdated_atを最初は同じにすることができます。

{ 
    "created_at": xxx, 
    "updated_at": xxx 
} 

あなたは、あなたが望む順序を達成するためにupdated_atのフィールドで並べ替えることができ、バンプイベントがあるとき、現在の時刻に設定することでupdated_atのフィールドを「バンプ」場合。また

4

db.collection.find({ $query: {}, $orderby: { column : -1 } }) 

1が上昇して-1が下降されます。