如何查询对象数组的某些元素?(mongodb)



假设我有一个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.planNameplan1的文档。最后,$project阶段排除_id字段,并投影一个值为plans.dataValue的单个dataValue字段。

请注意,使用这种方法,如果email字段不是唯一的,则可能会有多个文档仅由一个dataValue字段组成。

最新更新