我是使用"workbench.view.debug"
的初学者。我必须将一个或多个文档嵌入到另一个文档中,其中用于查找的键是Mongo
,应向下舍入到第二个。我怎样才能达到这个结果?
如果我应该对多个键执行查询,比如说ISODate
和DtEvent
,怎么办?
这是一个示例数据集:
WorkstationId
集合:
temperature
{
"WorkstationId" : 1,
"DtEvent" : ISODate("2020-01-01T00:00:10.723Z"),
"ParameterName" : "temperature",
"ParameterValue" : 232.1
}
{
"WorkstationId" : 1,
"DtEvent" : ISODate("2020-01-01T00:00:56.622Z"),
"ParameterName" : "temperature",
"ParameterValue" : 231.9
}
集合:
pressure
我尝试执行以下操作:
{
"WorkstationId" : 1,
"DtEvent" : ISODate("2020-01-01T00:00:10.725Z"),
"ParameterName" : "pressure",
"ParameterValue" : 3276.69
}
{
"WorkstationId" : 1,
"DtEvent" : ISODate("2020-01-01T00:00:56.641Z"),
"ParameterName" : "pressure",
"ParameterValue" : 3276.69
}
{
"WorkstationId" : 1,
"DtEvent" : ISODate("2020-01-01T00:01:42.622Z"),
"ParameterName" : "pressure",
"ParameterValue" : 3276.69
}
但是,正如预期的那样,由于密钥不完全匹配,因此未嵌入文档:
db.pressure.aggregate([{
$lookup: {
from: "temperature",
localField: "DtEvent",
foreignField: "DtEvent",
as: "temperature"
}
}])
答案 0 :(得分:1)
经典$lookup
期望完全匹配。由于您的Dates
不是精确值,因此您需要运行uncorrelated sub-query
db.pressure.aggregate([
{
$lookup: {
from: "temperature",
let: {
dt_event: {
$dateToString: {
date: "$DtEvent",
format: "%Y-%m-%dT%H:%M:%S"
}
}
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$$dt_event",
{
$dateToString: {
date: "$DtEvent",
format: "%Y-%m-%dT%H:%M:%S"
}
}
]
}
}
}
],
as: "temperature"
}
}
])
注意:MongoDB不会使用索引,因此对于大型集合而言性能会很差