这是我的JSON格式数据之一:
{
"_id" : ObjectId("5bfdb412a80939b6ed682090"),
"accounts" : [
{
"_id" : ObjectId("5bf106eee639bd0df4bd8e05"),
"accountType" : "DDA",
"productName" : "DDA1"
},
{
"_id" : ObjectId("5bf106eee639bd0df4bd8df8"),
"accountType" : "VSA",
"productName" : "VSA1"
},
{
"_id" : ObjectId("5bf106eee639bd0df4bd8df9"),
"accountType" : "VSA",
"productName" : "VSA2"
}
]
}
我想查询以获取accountType = VSA
的所有productName(无重复)。
我写了一个mongo查询:
db.Collection.distinct("accounts.productName", {"accounts.accountType": "VSA" })
我希望:['VSA1', 'VSA2']
我得到: ['DDA','VSA1', 'VSA2']
有人知道为什么查询不能以不同的方式工作吗?
答案 0 :(得分:2)
distinct方法的第二个参数表示:
一个查询,指定要从中检索不同值的文档。
但事实是,您只显示了一个带有嵌套元素数组的文档,因此将根据条件"accounts.accountType": "VSA"
返回整个文档。
要修复在应用过滤之前必须使用Aggregation Framework和$unwind嵌套数组的问题,然后可以将$group与$addToSet一起使用以获取唯一值。试试:
db.col.aggregate([
{
$unwind: "$accounts"
},
{
$match: {
"accounts.accountType": "VSA"
}
},
{
$group: {
_id: null,
uniqueProductNames: { $addToSet: "$accounts.productName" }
}
}
])
打印:
{ "_id" : null, "uniqueProductNames" : [ "VSA2", "VSA1" ] }