mongodb - 在 mongodb 中二级展开后如何进行匹配?
问题描述
我正在开发一个使用 MongoDB 作为数据库的软件。我有一个这样的集合(这只是一个文件)
{
"_id" : ObjectId("5aef51e0af42ea1b70d0c4dc"),
"EndpointId" : "89799bcc-e86f-4c8a-b340-8b5ed53caf83",
"DateTime" : ISODate("2018-05-06T19:05:04.574Z"),
"Url" : "test",
"Tags" : [
{
"Uid" : "E2:02:00:18:DA:40",
"Type" : 1,
"DateTime" : ISODate("2018-05-06T19:05:04.574Z"),
"Sensors" : [
{
"Type" : 1,
"Value" : NumberDecimal("-98")
},
{
"Type" : 2,
"Value" : NumberDecimal("-65")
}
]
},
{
"Uid" : "12:3B:6A:1A:B7:F9",
"Type" : 1,
"DateTime" : ISODate("2018-05-06T19:05:04.574Z"),
"Sensors" : [
{
"Type" : 1,
"Value" : NumberDecimal("-95")
},
{
"Type" : 2,
"Value" : NumberDecimal("-59")
},
{
"Type" : 3,
"Value" : NumberDecimal("12.939770381907275")
}
]
}
]
}
我想在它上面运行这个查询。
db.myCollection.aggregate([
{ $unwind: "$Tags" },
{
$match: {
$and: [
{
"Tags.DateTime": {
$gte: ISODate("2018-05-06T19:05:02Z"),
$lte: ISODate("2018-05-06T19:05:09Z"),
},
},
{ "Tags.Uid": { $in: ["C1:3D:CA:D4:45:11"] } },
],
},
},
{ $unwind: "$Tags.Sensors" },
{ $match: { "$Tags.Sensors.Type": { $in: [1, 2] } } },
{
$project: {
_id: 0,
EndpointId: "$EndpointId",
TagId: "$Tags.Uid",
Url: "$Url",
TagType: "$Tags.Type",
Date: "$Tags.DateTime",
SensorType: "$Tags.Sensors.Type",
Value: "$Tags.Sensors.Value",
},
},
])
问题是,第二个匹配项(检查$Tags.Sensors.Type
)不起作用并且不会影响查询结果。
我该如何解决?
如果这不是正确的方法,那么运行这些条件的正确方法是什么?
解决方案
该$match
阶段接受不带前导$
符号的字段名称。您在第一$match
阶段正确地做到了这一点,但在您编写的第二阶段$Tags.Sensors.Type
。只需删除前导$
符号即可使您的查询正常工作。
请注意,整个事情可以稍微简化(并且一些美化也不会受到伤害):
您不需要
$and
在您的示例中使用,因为如果您在过滤器中指定多个标准,则默认情况下会使用它。$in
您用于过滤器的可以Tags.Sensors.Type
是一种简单:
的相等运算符,除非您在可接受值列表中有多个元素。在这个阶段,除非字段的顺序很重要,否则您可以使用语法
$project
而不是(某种)重复相同的字段名称。<field>: 1
所以最终的查询将是这样的。
db.myCollection.aggregate([
{
"$unwind" : "$Tags"
},
{
"$match" : {
"Tags.DateTime" : { "$gte" : ISODate("2018-05-06T19:05:02Z"), "$lte" : ISODate("2018-05-06T19:05:09Z") },
"Tags.Uid" : { "$in" : ["C1:3D:CA:D4:45:11"] }
}
}, {
"$unwind" : "$Tags.Sensors"
}, {
"$match" : {
"Tags.Sensors.Type" : { "$in" : [1,2] }
}
},
{
"$project" : {
"_id" : 0,
"EndpointId" : 1,
"TagId" : "$Tags.Uid",
"Url" : 1,
"TagType" : "$Tags.Type",
"Date" : "$Tags.DateTime",
"SensorType" : "$Tags.Sensors.Type",
"Value" : "$Tags.Sensors.Value"
}
}])
推荐阅读
- bash - 从两个文本文件中找到具有不同值的相同键
- javascript - 使用 NodeJS 下载大量图像
- cypress - 赛普拉斯视口无法准确反映指定的设备
- php - 如何使用 php 和 .htaccess 生成 SEO 友好的导航链接?
- javascript - 带有导航栏引导的搜索栏
- reactjs - 使用 jspdf-html2canvas 时字段离开页面
- c# - 如何在一对多关系中获取父项的子条目的参考?
- reactjs - 反应钩子参数导致无限重新渲染
- intellij-idea - 如何在 Intellij 或其他 JetBrains IDE 中使用 ctags 生成的标签文件?
- here-api - 是否有任何 HERE API 可以为我提供施工区的限速信息?