多くのフィールドを持つmongodb
コレクションがあります。 1つのフィールドは「date_time」で、これはISO日時形式です。例:ISODate("2014-06-11T19:16:46Z")
、もう1つのフィールドは「name」です。
name
が与えられた場合、コレクション内の最も古い/最も若い投稿を見つけるにはどうすればよいですか?
例:コレクション 'data'にtwo
の投稿がある場合:
_[{'name' : 'John', 'date_time' : ISODate("2014-06-11T19:16:46Z")},
{'name' : 'John', 'date_time' : ISODate("2015-06-11T19:16:46Z")}]
_
'John'という名前の場合、コレクション内の最も古い投稿、つまりISODate("2014-06-11T19:16:46Z")
の投稿を見つけるにはどうすればよいですか?最年少のポストについても同様です。
最も古い:
db.posts.find({ "name" : "John" }).sort({ "date_time" : 1 }).limit(1)
最新:
db.posts.find({ "name" : "John" }).sort({ "date_time" : -1 }).limit(1)
クエリを効率的にするために、{ "name" : 1, "date_time" : 1 }
のインデックスを作成します。
以下のように集計できます。
index
および_date_time
_フィールドにname
を作成して、_$match
_および_$sort
_ステージ操作で使用できるようにします。
db.t.ensureIndex({"name":1,"date_time":1})
_$match
_目的のname(s)
のすべてのレコード。
$sort
_ by _date_time
_昇順。$group
_ name
フィールド。 $ first 演算子を使用して、グループの最初のレコードを取得します。これも最も古いレコードになります。 $ last 演算子を使用して、グループ内の最後のレコードを取得します。これも最新です。コード:
_db.t.aggregate([
{$match:{"name":"John"}},
{$sort:{"date_time":1}},
{$group:{"_id":"$name","oldest":{$first:"$$ROOT"},
"youngest":{$last:"$$ROOT"}}}
])
_
o/p:
_{
"_id" : "John",
"oldest" : {
"_id" : ObjectId("54da62dc7f9ac597d99c182d"),
"name" : "John",
"date_time" : ISODate("2014-06-11T19:16:46Z")
},
"youngest" : {
"_id" : ObjectId("54da62dc7f9ac597d99c182e"),
"name" : "John",
"date_time" : ISODate("2015-06-11T19:16:46Z")
}
}
_