我在集合名称chats
中有以下文档:
{
"_id" : 25281,
"conversation" : [
{
"time" : "1970-01-18T20:16:28.988Z"
},
{
"time" : "2018-11-09T18:43:09.297Z"
}
],
}
出于某种原因,尽管类似的文档将按预期返回,但以下查询中未返回该特定文档。
以下是查询:
db.getCollection('chats').find({"conversation.1.time":
{
"$gte": ISODate("2018-11-09T00:00:00.000Z"),
"$lt": ISODate("2018-11-10T00:00:00.000Z")
}
})
答案 0 :(得分:1)
该文档不匹配,因为查询中指定的ISODate
与数据模型中的string
之间不匹配。 MongoDB在值之前检查类型,这就是为什么没有值的原因。来自docs
但是,对于大多数数据类型,比较运算符仅在目标字段的BSON类型与查询操作数的类型匹配的文档上执行比较。
有三种解决方法。您可以在查询中更改类型:
db.getCollection('chats').find({"conversation.1.time":
{
"$gte": "2018-11-09T00:00:00.000Z",
"$lt": "2018-11-10T00:00:00.000Z"
}
})
或者您需要转换chats
中的数据:
{
"_id" : 25281,
"conversation" : [
{
"time" : ISODate("1970-01-18T20:16:28.988Z")
},
{
"time" : ISODate("2018-11-09T18:43:09.297Z")
}
],
}
或者,您可以查看Aggregation Framework中的$toDate运算符(在MongoDB 4.0中引入):
db.getCollection('chats').aggregate([
{
$addFields: {
value: { $arrayElemAt: [ "$conversation", 1 ] }
}
},
{
$match: {
$expr: {
$and: [
{ $gte: [ { $toDate: "$value.time" }, ISODate("2018-11-09T00:00:00.000Z") ] },
{ $lt: [ { $toDate: "$value.time" }, ISODate("2018-11-10T00:00:00.000Z") ] },
]
}
}
}
])