假设我有一个mongo DB集合,记录如下:
{
email: "person1@gmail.com",
plans: [
{planName: "plan1", dataValue = 100},
{planName: "plan2", dataValue = 50}
]
},
{
email: "person2@gmail.com",
plans: [
{planName: "plan3", dataValue = 25},
{planName: "plan4", dataValue = 12.5}
]
}
并且我想查询使得仅dataValue返回电子邮件所在的位置";person1@gmail.com"并且planName是";计划1";。我该如何处理?
您可以使用聚合管道来实现这一点。
管道可能看起来像这样:
db.collection.aggregate([
{ $match: { "email" :"person1@gmail.com", "plans.planName": "plan1" }},
{ $unwind: "$plans" },
{ $match: { "plans.planName": "plan1" }},
{ $project: { "_id": 0, "dataValue": "$plans.dataValue" }}
])
第一个$match阶段将检索email
字段等于person1@gmail.com
并且plans
数组中的任何元素的planName
等于plan1
的文档。
第二个$unfold阶段将为plans
数组中的每个元素输出一个文档。plans
字段现在将是一个包含单个计划对象的对象。
在第三$match
阶段中,展开的文档被进一步匹配以仅包括plans.planName
为plan1
的文档。最后,$project阶段排除_id
字段,并投影一个值为plans.dataValue
的单个dataValue
字段。
请注意,使用这种方法,如果email
字段不是唯一的,则可能会有多个文档仅由一个dataValue
字段组成。