Mongodb 如何比较文档中的两个日期字段,其中一个嵌入到数组中?
我试图比较两个指定为$type=“date”的字段,但是当我尝试查询时,得到的结果为0。 我的最终目标是输出s.status=6和s.timeMongodb 如何比较文档中的两个日期字段,其中一个嵌入到数组中?,mongodb,Mongodb,我试图比较两个指定为$type=“date”的字段,但是当我尝试查询时,得到的结果为0。 我的最终目标是输出s.status=6和s.time
db.inventory.insertMany( [
{ item: "canvas","r" : {"$date" : "2019-05-23T00:00:00.000+0000"},"s" :[{ "status" : 1, "time" : { "$date" : "2019-05-23T23:03:10.000+0000" } }, { "status" : 2, "time" : { "$date" : "2019-05-23T23:05:03.000+0000" } }, { "status" : 4, "time" : { "$date" : "2019-05-23T23:05:06.000+0000" } }, { "status" : 5, "time" : { "$date" : "2019-05-23T23:05:07.000+0000" } }, { "status" : 6, "time" : { "$date" : "2019-05-23T23:05:09.000+0000" } } ]},
{ item: "paper","r" : { "$date" : "2019-05-24T06:00:00.000+0000" }, "s" : [ { "status" : 1, "time" : { "$date" : "2019-05-23T23:03:10.000+0000" } }, { "status" : 2, "time" : { "$date" : "2019-05-23T23:05:03.000+0000" } }, { "status" : 3, "time" : { "$date" : "2019-05-23T23:05:06.000+0000" } }, { "status" : 4, "time" : { "$date" : "2019-05-25T05:05:07.000+0000" } }, { "status" : 6, "time" : { "$date" : "2019-05-25T05:55:09.000+0000" } } ] },
{ item: "stone","r" : { "$date" : "2019-05-23T05:00:00.000+0000" }, "s" : [ { "status" : 1, "time" : { "$date" : "2019-05-23T23:03:10.000+0000" } }, { "status" : 2, "time" : { "$date" : "2019-05-23T23:05:03.000+0000" } } ] },
{ item: "mass","r" : {"$date" : "2019-05-24T06:00:00.000+0000"},"s" :[ { "status" : 1, "time" : { "$date" : "2019-05-23T23:03:10.000+0000" } }, { "status" : 2, "time" : { "$date" : "2019-05-23T23:05:03.000+0000" } }, { "status" : 4, "time" : { "$date" : "2019-05-23T23:05:06.000+0000" } }, { "status" : 5, "time" : { "$date" : "2019-05-23T23:05:07.000+0000" } }, { "status" : 6, "time" : { "$date" : "2019-05-24T06:06:09.000+0000" } } ] },
{item : "paper","r" : {"$date" : "2019-05-24T06:00:00.000+0000" },"s" :[ { "status" : 1, "time" : { "$date" : "2019-05-23T23:03:10.000+0000" } }, { "status" : 2, "time" : { "$date" : "2019-05-23T23:05:03.000+0000" } }, { "status" : 4, "time" : { "$date" : "2019-05-23T23:05:06.000+0000" } }, { "status" : 5, "time" : { "$date" : "2019-05-23T23:05:07.000+0000" } }, { "status" : 6, "time" : { "$date" : "2019-05-24T06:06:09.000+0000" } } ] }
]);
我试过的-
db.inventory.find({"s": {"$elemMatch" : {"status" : 6,"time" : { "$lt" : ISODate(this.r)}}});
我没有收到任何错误结果。到目前为止,
$elemMatch
不支持与字段进行比较
以下查询可以获得预期的输出:
db.inventory.find({
$expr:{
$gt:[
{
$size:{
$filter:{
"input":"$s",
"as":"doc",
"cond":{
$and:[
{
$eq:["$$doc.status",6]
},
{
$lt:["$$doc.time","$r"]
}
]
}
}
}
},
0
]
}
}).pretty()
字段“r.$date”是字符串类型,不是日期类型。子文档中定义的“s”数组中的日期也是如此。这些需要是日期类型以进行比较(作为日期)。@prasad(
r
是ISODate
类型,即{“r”:ISODate(“2019-05-23T00:00:00.000+0000”)
和{“r”:{“$date”:“2019-05-23T00:00:00.000+0000”}
是相同的,并且r.$date
甚至不是一个字段。@Mr.S.Sharma在运行db.inventory.insertMany([
在问题帖中,尝试以下命令:db.dates.find({r.$date:{$type:'date}})
和db.dates.find({“r.$date”:{$type:'string'})
。结果显示,$date
字段是一个字符串类型(而不是日期类型字段)。@prasad\u我试图传达的观点是,{$date:}
是ISODate(“”)的扩展形式
。因此,我们可以直接查询r
,而不是查询r.$date
。请参阅@Mr.S.Sharma{$date:“}不是ISODate(“”)的扩展形式。它是JSON的扩展格式。