MongoDB - 查询以获取与聚合中排序的第一项中的键匹配的项目
MongoDB - query to get items that match key in first item of sort in aggregate
我们在集合中有以下记录:
{ "_id" : ObjectId("1"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("2"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("3"), "date" : ISODate("2017-03-03T00:00:00Z") }
{ "_id" : ObjectId("4"), "date" : ISODate("2017-02-02T00:00:00Z") }
{ "_id" : ObjectId("5"), "date" : ISODate("2017-03-01T00:00:00Z") }
{ "_id" : ObjectId("6"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("7"), "date" : ISODate("2017-01-02T00:00:00Z") }
{ "_id" : ObjectId("8"), "date" : ISODate("2017-01-03T00:00:00Z") }
如何按 date
字段的 $month
过滤最近的记录,如下所示:
{ "_id" : ObjectId("3"), "date" : ISODate("2017-03-03T00:00:00Z") }
{ "_id" : ObjectId("5"), "date" : ISODate("2017-03-01T00:00:00Z") }
如果您使用 collection.find() 方法,请同时使用 sort 方法。
像这样:collection.find().sort({created : -1})
如果要过滤,看这个一次:
collection.find({ $expr: {
$eq: [{ $month: "$date" }, 03]
}});
希望对您有所帮助!
$group
- 按 date
开始的月份的第一天分组,并将文档添加到 data
数组中。
$sort
- 按 _id
DESC.
排序
$skip
$limit
- 从结果中取出第一个文档。
$unwind
- 将 data
数组解构为多个文档。
$replaceWith
- 将文档替换为 data
文档。
db.collection.aggregate([
{
$group: {
_id: {
"$dateFromParts": {
"year": {
$year: "$date"
},
"month": {
$month: "$date"
},
"day": 1
}
},
data: {
$push: "$$ROOT"
}
}
},
{
$sort: {
_id: -1
}
},
{
$skip: 0
},
{
$limit: 1
},
{
$unwind: "$data"
},
{
$replaceWith: "$data"
}
])
如果愿意使用聚合,可以使用
$month
从 date 获取月份
$match
过滤值
$sort
按 ASC 或 DESC 排序
$project
保留或删除字段
这是代码
db.collection.aggregate([
{
"$addFields": {
month: { $month": "$date"}
}
},
{ "$match": { month: 3 } },
{ "$sort": { date: 1}},
{ "$project": { date: 1 } }
])
我们在集合中有以下记录:
{ "_id" : ObjectId("1"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("2"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("3"), "date" : ISODate("2017-03-03T00:00:00Z") }
{ "_id" : ObjectId("4"), "date" : ISODate("2017-02-02T00:00:00Z") }
{ "_id" : ObjectId("5"), "date" : ISODate("2017-03-01T00:00:00Z") }
{ "_id" : ObjectId("6"), "date" : ISODate("2017-02-01T00:00:00Z") }
{ "_id" : ObjectId("7"), "date" : ISODate("2017-01-02T00:00:00Z") }
{ "_id" : ObjectId("8"), "date" : ISODate("2017-01-03T00:00:00Z") }
如何按 date
字段的 $month
过滤最近的记录,如下所示:
{ "_id" : ObjectId("3"), "date" : ISODate("2017-03-03T00:00:00Z") }
{ "_id" : ObjectId("5"), "date" : ISODate("2017-03-01T00:00:00Z") }
如果您使用 collection.find() 方法,请同时使用 sort 方法。
像这样:collection.find().sort({created : -1})
如果要过滤,看这个一次:
collection.find({ $expr: {
$eq: [{ $month: "$date" }, 03]
}});
希望对您有所帮助!
$group
- 按date
开始的月份的第一天分组,并将文档添加到data
数组中。
排序$sort
- 按_id
DESC.$skip
$limit
- 从结果中取出第一个文档。$unwind
- 将data
数组解构为多个文档。$replaceWith
- 将文档替换为data
文档。
db.collection.aggregate([
{
$group: {
_id: {
"$dateFromParts": {
"year": {
$year: "$date"
},
"month": {
$month: "$date"
},
"day": 1
}
},
data: {
$push: "$$ROOT"
}
}
},
{
$sort: {
_id: -1
}
},
{
$skip: 0
},
{
$limit: 1
},
{
$unwind: "$data"
},
{
$replaceWith: "$data"
}
])
如果愿意使用聚合,可以使用
$month
从 date 获取月份
$match
过滤值$sort
按 ASC 或 DESC 排序$project
保留或删除字段
这是代码
db.collection.aggregate([
{
"$addFields": {
month: { $month": "$date"}
}
},
{ "$match": { month: 3 } },
{ "$sort": { date: 1}},
{ "$project": { date: 1 } }
])