Mongodb 按月查找子文档
Mongodb find subdocument by month
我有一份 collection,其中包含以下文件。
{
"id":1,
"url":"mysite.com",
"views":
[
{"ip":"1.1.1.1","date":ISODate("2015-03-13T13:34:40.0Z")},
{"ip":"2.2.2.2","date":ISODate("2015-03-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-02-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-02-13T13:34:40.0Z")}
]
},
{
"id":2,
"url":"mysite2.com",
"views":
[
{"ip":"1.1.1.1","date":ISODate("2015-06-13T13:34:40.0Z")},
{"ip":"2.2.2.2","date":ISODate("2015-08-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-11-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-11-13T13:34:40.0Z")}
]
}
如何找到在 6 月至少有一次查看的文档?我知道如何使用聚合(unwind > project > $month > match > group),但是有没有办法不用聚合呢?只需使用 db.find()?
这个有效:
db.collection.find(
{
$expr: {
$in: [6, { $map: { input: "$views", in: { $month: "$$this.date" } } }]
}
}
)
但是聚合管道并没有真正的区别:
db.collection.aggregate([
{
$match: {
$expr: {
$in: [6, { $map: { input: "$views", in: { $month: "$$this.date" } } }]
}
}
}
])
如果您需要查找几个月,例如“六月或十一月”使用这个:
db.collection.find(
{
$expr: {
$gt: [0, { $size: { $setIntersection: [[6, 11], { $map: { input: "$views", in: { $month: "$$this.date" } } }] } }]
}
}
)
我有一份 collection,其中包含以下文件。
{
"id":1,
"url":"mysite.com",
"views":
[
{"ip":"1.1.1.1","date":ISODate("2015-03-13T13:34:40.0Z")},
{"ip":"2.2.2.2","date":ISODate("2015-03-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-02-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-02-13T13:34:40.0Z")}
]
},
{
"id":2,
"url":"mysite2.com",
"views":
[
{"ip":"1.1.1.1","date":ISODate("2015-06-13T13:34:40.0Z")},
{"ip":"2.2.2.2","date":ISODate("2015-08-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-11-13T13:34:40.0Z")},
{"ip":"1.1.1.1","date":ISODate("2015-11-13T13:34:40.0Z")}
]
}
如何找到在 6 月至少有一次查看的文档?我知道如何使用聚合(unwind > project > $month > match > group),但是有没有办法不用聚合呢?只需使用 db.find()?
这个有效:
db.collection.find(
{
$expr: {
$in: [6, { $map: { input: "$views", in: { $month: "$$this.date" } } }]
}
}
)
但是聚合管道并没有真正的区别:
db.collection.aggregate([
{
$match: {
$expr: {
$in: [6, { $map: { input: "$views", in: { $month: "$$this.date" } } }]
}
}
}
])
如果您需要查找几个月,例如“六月或十一月”使用这个:
db.collection.find(
{
$expr: {
$gt: [0, { $size: { $setIntersection: [[6, 11], { $map: { input: "$views", in: { $month: "$$this.date" } } }] } }]
}
}
)