【问题标题】:How to get specific field from MongoDB collection using MongoDB shell?如何使用 MongoDB shell 从 MongoDB 集合中获取特定字段?
【发布时间】:2017-04-24 23:42:04
【问题描述】:

我已经使用 shell 命令在集合“clicklog”中索引了 Mongodb 中的一个 json 文件。下面是我的 shell 命令的结果:

db.clicklogs.find().pretty()

输出:

    {
            "_id" : ObjectId("58fe78dcfbe21fa7896552e8"),
            "preview" : false,
            "offset" : 0,
            "result" : {
                    "search_term" : "484797",
                    "request_time" : "Sat Apr 01 23:58:49 -0400 2017",
                    "request_ip" : "127.0.0.1",
                    "stats_type" : "clickstats",
                    "upi" : "66024330304",
                    "unit" : "CITCS",
                    "job_title" : "IT Engineer",
                    "vpu" : "ICR",
                    "organization" : "73",
                    "location" : "MH",
                    "city" : "San Diego",
                    "country" : "USA",
                    "title" : "TOM",
                    "tab_name" : "People-Tab",
                    "page_name" : "PEOPLE",
                    "result_number" : "1",
                    "page_num" : "0",
                    "session_id" : "14e88b44576ad4fdc035bc41529762ad1",
                    "total_results" : "1",
                    "_raw":"request_time=Sat Apr 01 23:58:49 -0400 2017,request_ip=127.0.0.1,application=Search,stats_type=clickstats,upi=660243301304,unit=CITCS,job_title=IT Assistant, Client Services,vpu=ICR,location=DHAKA, BANGLADESH (IFC),organization=73,city=Dhaka,country=BANGLADESH,city_code=,search_term=484797,title=   Tom,url=http://isearch.worldbank.org/skillfinder/ppl_profile_new/000484797,tab_name=People-Tab,page_name=PEOPLE,result_number=1,page_num=0,filter=qterm=484797,total_results=1,app_environment=production,log_version=1.0,session_id=4e88b44576ad4fdc035bc41529762ad1",
                    "_time":"2017-04-01T23:58:49.000-0400"

            }
    }
{"_id" : ObjectId("58fe78dcfbe21fa7896552e9"),
        "preview" : false,
        "offset" : 0,
         "result" : {
                "search_term" : "demo",
                "request_time" : "Sat Apr 01 23:58:49 -0400 2017",
                "request_ip" : "127.0.0.1",
                 ....
                 "time":"2017-04-01T23:58:49.000-0400"
}
}

对于每个 json 文档,我只想获取几个字段(id、searchterm、upi、page_name、sessionid、url(在 _raw 下))。是否可以使用 mongo shell 命令将结果文档存储在新集合中?任何帮助表示赞赏。

【问题讨论】:

  • 你的mongodb版本是多少?
  • 我使用的是最新版本 3.4.4

标签: json mongodb shell


【解决方案1】:

您可以在 3.4 版本中尝试以下聚合。

查询使用$split 运算符几次以达到url 值。其余是标准投影字段。

$out 阶段将结果写入新集合。

db.getCollection('clicklogs').aggregate([{
        $project: {
            searchterm: "$result.searchterm",
            upi: "$result.upi",
            page_name: "$result.page_name",
            session_id: "$result.session_id",
            url: {
                $let: {
                    vars: {
                        obj: {
                            $arrayElemAt: [{
                                $split: ["$result._raw", ',']
                            }, 1]
                        }
                    },
                    in: {
                        $arrayElemAt: [{
                            $split: ["$$obj", '=']
                        }, 1]
                    }
                }
            }
        }
    },
    {
        $out: "clicklogs_temp"
    }
])

【讨论】:

  • 嘿 Veeram,实际上我没有在问题的前面添加整个 _raw 数据。我已经更新了我的问题。 URL 现在位于位置 18。我尝试通过将 位置更改为 17 而不是 1 来使用您的代码。但它没有在结果中获得 URL 字段。如果我将位置保持在 1,我将获得带有 request_ip 值的 URL 字段。你能帮我解决这个问题吗?
  • 应该可以的。只是为了确认您确实更改了第一个 arrayAtElement 索引值,对吗?如果是,请验证数据。它适用于您在帖子中提供的数据。
  • 是的。我在 obj 和 in 将 areayAtElement 更改为 17 两次。我会再次检查。该集合有大约 6400 个 json 文档。感谢您的回复。
  • 不客气。您只需将arrayatElemnt 中的索引更改为obj 到17,这将返回类似url = valuein 内的arrayElemAt 将在索引1 处读取该值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多