能否用数组型键数组查询视图?多字段多值数据展示需求咨询
关于数组键数组查询视图及多值字段关联筛选的解决方案
1. 是否可以使用本身为数组的键数组来查询视图?
当然可以!用数组类型的键数组来查询视图是完全可行的,尤其是在你这种涉及多值字段关联筛选的场景下,这种方式能高效帮你匹配关联数据,直接用数组作为查询条件的输入就能精准定位到你需要的视图数据。
2. 针对多值字段关联筛选的实现方案
结合你描述的需求——针对特定id,根据用户选择的多个l1ser值,返回所有关联的l2ser,我给你整理了具体的实现思路和示例:
核心思路
我们需要匹配指定id的文档,筛选出l1ser包含目标数组中任意值的条目,然后提取对应的l2ser,如果有重复的l2ser还可以做去重处理。
示例实现(以MongoDB为例)
假设你的集合名为yourCollection,文档结构类似:
{ "id": "doc1", "l1ser": ["school", "IT company"], "l2ser": ["staffs", "students", "classrooms", "cisco", "anz", "cts"] }
基础查询(获取所有关联l2ser)
直接用$in操作符传入l1ser的目标数组作为查询条件:
db.yourCollection.find( { id: "doc1", // 替换为你要查询的特定id l1ser: { $in: ["school", "IT company"] } // 这里就是用数组作为查询的键数组 }, { l2ser: 1, _id: 0 } )
执行后会返回该文档中所有匹配l1ser条件的l2ser列表。
去重处理(获取唯一的l2ser)
如果不同l1ser对应的l2ser有重复,用聚合管道来实现去重:
db.yourCollection.aggregate([ // 第一步:匹配指定id和目标l1ser数组 { $match: { id: "doc1", l1ser: { $in: ["school", "IT company"] } } }, // 第二步:拆分l2ser数组为单个元素 { $unwind: "$l2ser" }, // 第三步:分组去重 { $group: { _id: null, uniqueL2ser: { $addToSet: "$l2ser" } } }, // 第四步:调整输出格式 { $project: { _id: 0, uniqueL2ser: 1 } } ])
这样就能得到去重后的所有关联l2ser,比如["staffs", "students", "classrooms", "cisco", "anz", "cts"]。
基于视图的查询
如果你想预先创建视图来简化查询,可以先创建关联视图:
db.createView("l1l2RelationView", "yourCollection", [ { $unwind: "$l1ser" }, { $unwind: "$l2ser" }, { $group: { _id: { id: "$id", l1ser: "$l1ser" }, l2serList: { $addToSet: "$l2ser" } } }, { $project: { _id: 0, id: "$_id.id", l1ser: "$_id.l1ser", l2serList: 1 } } ])
之后查询视图时,同样用数组作为键数组:
db.l1l2RelationView.find( { id: "doc1", l1ser: { $in: ["school", "IT company"] } }, { l2serList: 1, _id: 0 } )
把返回的多个l2serList合并起来,就是你需要展示的所有关联l2ser。
内容的提问来源于stack exchange,提问作者Thiruveni Balasubramanian
相关产品推荐
相关产品推荐

