mongoDB Distict问题

时间:2018-11-29 21:27:25

标签: mongodb mongoose

这是我的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']

有人知道为什么查询不能以不同的方式工作吗?

1 个答案:

答案 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" ] }