【问题标题】:get only a particular field from embedded array object in mongodb collection仅从 mongodb 集合中的嵌入式数组对象中获取特定字段
【发布时间】:2019-08-28 06:25:45
【问题描述】:

我有一个 MongoDB 集合,它看起来与下面的文档相同,我只想找到嵌入数组对象中的一个字段值计数。

我试过下面的查询来获取数据,但没有用

db.mycollection.find({'quizzes':{skill:'html'}}).pretty()

下面是带有示例值的 mongo 文档结构。结构和我原来的文档一样

{

"user": "values",

"date": "234-234-234-234",

"quizzes":[

   {

     "skill": "html",
     "score": "12"

}

]

}

从上面的文档中,我只想获取 quizzes 数组中存在的技能字段值,该数组是一个嵌入式文档。 我的输出应该是这样的

{
"html": 10,
"php": 20,
"C#": 15,
"java": 18,
.
.
.
.
.

}

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以使用distinct() 方法。以下查询可以得到我们预期的输出:

    db.mycollection.distinct("quizzes.skill");
    

    更多信息请查看https://docs.mongodb.com/manual/reference/method/db.collection.distinct/

    编辑 I:也计算技能数量

    db.collection.aggregate([
        {
            $unwind:"$quizzes"
        },
        {
            $group:{
                "_id":"$quizzes.skill",
                "k":{
                    $first:"$quizzes.skill"
                },
                "v":{
                    $sum:1
                }
            }
        },
        {
            $project:{
                "_id":0
            }
        },
        {
            $group:{
                "_id":null,
                "data":{
                    $push:"$$ROOT"
                }
            }
        },
        {
            $project:{
                "data":{
                    $arrayToObject:"$data"
                }
            }
        },
        {
            $replaceRoot:{
                "newRoot":"$data"
            }
        }
    ]).pretty()
    

    数据集:

    {
        "_id" : ObjectId("5d66ad357d0ab652c42315f7"),
        "user" : "values",
        "date" : "234-234-234-234",
        "quizzes" : [
            {
                "skill" : "html",
                "score" : "12"
            },
            {
                "skill" : "css",
                "score" : "10"
            }
        ]
    }
    {
        "_id" : ObjectId("5d66ad357d0ab652c42315f8"),
        "user" : "values2",
        "date" : "234-234-234-234",
        "quizzes" : [
            {
                "skill" : "Java",
                "score" : "12"
            },
            {
                "skill" : "html",
                "score" : "10"
            }
        ]
    }
    

    输出:

    { "Java" : 1, "css" : 1, "html" : 2 }
    

    说明:我们正在创建一个键值对 (k,v),其中“k”是技能,“v”是技能出现次数。将字段名称作为“k”和“v”的原因是因为$arrayToObject 只接受这些字段。稍后,将所有键和值合并以准备最终文档。

    【讨论】:

    • @Sharma 正是这只会为您提供确切的不同值。但我也需要重复的值来获得计数。例如:{'html':10, 'php': 15} 明智的
    • @GopiP 更新答案
    • 感谢它的魅力。我们有什么好办的吗???只是为了学习目的
    • @GopiP 根据您的要求,我们这样做了。如果您需要这样的回复:{"skills":[{"skill":"html":2},{"css":1},{"Java":1}]},那么可以轻松完成。
    • 哦,谢谢@Sharma,如果可能的话,请您也分享代码。所以,我也可以知道这一点。
    【解决方案2】:

    您可以使用聚合来获得所需的结果。

    db.myCollection.aggregate({ $group: { "skill": "$quizzes.skill","count":{ "$sum":1 }} })

    【讨论】:

    • 当我运行上述查询时,它会给出以下错误字段“技能”必须是累加器对象
    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多