mongodb - 在两个日期之间查询 mongoDB 缺少一些文档
问题描述
我在集合名称中有以下文档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")
}
})
解决方案
此文档不匹配,因为ISODate
您的查询和string
数据模型中的指定不匹配。MongoDB 在值之前检查类型,这就是你没有得到值的原因。来自文档
然而,对于大多数数据类型,比较运算符仅对目标字段的 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")
}
],
}
或者,您可以查看聚合框架中的$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") ] },
]
}
}
}
])
推荐阅读
- python - 从 cassandra 获取所有数据
- bash - 用于在其中包含 .git 目录的所有子文件夹中进行 git pull 的代码的 if 语句问题
- android - 如何修复错误:找不到 recyclerview-v7.jar (com.android.support:recyclerview-v7:28.0.0)
- java - 如何从 onClickListener 之外的 onClickListener 获取值
- matlab - 重命名子系统的输入和输出
- excel - 如何通过 Excel VBA 修改 Powerpoint Chart ChartData
- gensim - gensim/models/ldaseqmodel.py:217:RuntimeWarning:在 double_scalars 中遇到除以零
- python - 图例仅出现在 1 行的全息视图中
- amazon-web-services - 在 Cognito 用户池中注册时如何检查用户是否已经存在具有相同的电子邮件或电话号码
- bash - 使用 awk 命令解析 /etc/passwd 而不为每一行创建输出文件并从那里读取