我有一个situations
包含以下结构的文档的集合:
{
"_id" : “32AzuAkJ8PXEgSkcuFII0YSeVUl1",
"situations" : [
{
"datetime" : "2018-11-28T21:21:49.013Z"
},
{
"datetime" : "2018-11-29T15:17:50.913Z"
},
{
"datetime" : "2018-11-30T22:50:01.684Z"
},
],
"user" : [
{
"email" : “[email protected]”,
"userType" : “new”
}
]
}
我需要过滤掉其中至少有一个间情况的文件14 days
,并7 days ago
和至少一个情况之间7 days ago
和now
。它必须通过聚合管道进行,因为稍后我将需要执行其他操作。
首先,我尝试了以下管道:
{
$match: {
$and: [
{
$expr: {
$and: [
{ "$situations.datetime": { $gt: new Date((new Date().getTime() - (7 * 24 * 60 * 60 * 1000))) } },
{ "$situations.datetime": { $lte: new Date((new Date().getTime())) } }
]
}
},
{
$expr: {
$and: [
{ "$situations.datetime": { $gt: new Date((new Date().getTime() - (14 * 24 * 60 * 60 * 1000))) } },
{ "$situations.datetime": { $lte: new Date((new Date().getTime() - (7 * 24 * 60 * 60 * 1000))) } }
]
}
}
]
}
}
但这没有用。我认为因为我datetime
是一个字符串。然后我正在考虑以$dateFromString
某种方式使用它,但是我不知道如何在situations
数组中使用它。
如您所知,您无法将日期与数据库中存储的字符串进行比较-MongoDB绝不会返回此类查询的任何结果。在这种情况下,更简单的方法是使用.toJSON()函数将内存中的日期转换为字符串(在Mongo shell中进行了测试-您可以从任何编程语言构建相同的字符串)。
我在这里看到的另一个问题是您尝试应用两对条件,因此需要使用$ elemMatch。否则,您可能有4个不同的日期,并且每个日期都将与您的条件之一匹配,而您试图situation
在两个日期之间找到一个。
您的查询可能如下所示:
db.col.aggregate([
{
$match: {
$and: [
{
"situations": {
$elemMatch: {
datetime: {
$gt: new Date((new Date().getTime() - (7 * 24 * 60 * 60 * 1000))).toJSON(),
$lte: new Date((new Date().getTime())).toJSON()
}
}
}
},
{
"situations": {
$elemMatch: {
datetime: {
$gt: new Date((new Date().getTime() - (14 * 24 * 60 * 60 * 1000))).toJSON(),
$lte: new Date((new Date().getTime() - (7 * 24 * 60 * 60 * 1000))).toJSON()
}
}
}
}
]
}
}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句