如何解决如何转换为ObjectId并在MongoDB查找上匹配日期?
我要从架构中的嵌套值中获取一个ID,然后使用该ID从另一个表中查找该ID,并从该表中的几个日期进行匹配。我尝试了常规的match / lookup / unwind / match以及lookup / let / pipeline技术。在这两种情况下,由于某种原因,它都会忽略日期匹配。我想念什么?
这里是一种参考方法。我也不知道该放在哪儿,因为它似乎并没有拉出$ meeting来进行排序。
示例记录
PRODUCT
{
"_id" : ObjectId("5f36c0df6d5553e6af208cac"),"items" : [
{
"paramType" : "Meeting","paramValue" : "5f36c0df6d5553e6af208cab"
}
],"ownerId" : ObjectId("12345678901234567")
}
MEETING
{
"_id" : ObjectId("5f36c0df6d5553e6af208cab"),"startDate" : ISODate("2020-08-18T10:00:00.000+0000"),"endDate" : ISODate("2020-08-18T11:00:00.000+0000")
}
AGGREGATE
db.getCollection("products").aggregate(
[
{
$match: {
"ownerId": ObjectId("12345678901234567")
}
},{
$unwind: "$items"
},{
$lookup: {
from: "meetings",let: { "meetingId": '$items.paramValue' },pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$_id","$$meetingId"] },{
$eq: ["meeting.startDate",{
"$gte": ["$meeting.startDate",ISODate("2020-08-01T00:00:00.000Z")]
}]
},{
$eq: ["meeting.endDate",{
"$lte": ["$meeting.endDate",ISODate("2020-08-31T23:59:59.999Z")]
}]
}
],},],as: "meeting"
}
},{
$unwind: "$meeting"
},{
$project: {
"_id": 1,"items": 1,"meeting": "$meeting"
}
},{
$sort: {
'meeting.startDate': 1
}
},]
);
这可能是因为item.paramValue
在查找之前未转换为ObjectId。但是无法弄清楚如何在聚合中进行转换。我试过了,但是没有去
{
$addFields: {
"convertedMeetingId": { $toObjectId: "$items.paramValue" }
}}
let: { "meetingId": "$convertedMeetingId" }
解决方法
na
中的其他一些快速修复看起来不错,
-
$lookup
,您可以在此处使用let
将meetingId
字符串转换为ObjectId
-
$toObjectId
和$gte
,您分别使用了$lte
和$meeting.startDate
,因为您已经在{{1 }}查找。 - 我不确定您为什么使用$ eq并与
$meeting.endDate
和$startDate
一起使用,如果我没记错,我已经更正并删除了$ eq,它将直接运行。
$endDate
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。