如何获取集合中嵌套项的值?

3
假设我有这个文档:
{
    "_id" : ObjectId("4e2f2af16f1e7e4c2000000a"),
    "location" : {
        "geometry" : [
            [ 123, 23.45321 ],
            [ 124.55632, 43.256 ]
        ]
    },
    "advertisers" : {
        "created_at" : ISODate("2011-07-26T21:02:19Z"),
        "category" : "Infinity Pro Spin Air Brush",
        "updated_at" : ISODate("2011-07-26T21:02:19Z"),
        "lowered_name" : "conair",
        "twitter_name" : "",
        "facebook_page_url" : "",
        "website_url" : "",
        "user_ids" : [ ],
        "blog_url" : ""
    }
}

我希望获取'advertisers'中特定的值,例如lowered_name。

查询时,可以使用以下语法:

db.advertisers.find({"advertisers.lowered_name" : "conair"})

当然,它会返回与查询相等的文档。我如何只获取特定值"conair"。例如,在打印语句中使用:使用这样的代码将导致错误:

for cursor in results:
    print(cursor["advertisers.lowered_name"])

这该怎么做呢?我试着搜索过,但可能漏看了些什么?

2
你尝试过 db.advertisers.distinct("advertisers.lowered_name") 吗? - s7vr
1
使用投影:.find({"advertisers.lowered_name" : "conair"}, {"advertisers.lowered_name": 1}) - styvane
@Veeram 啊,我刚试了一下。我确实得到了不同值的值,但是在整个集合中。我需要在循环中获取单个值以进行操作。 - Reiion
@M.StyvaneSoukossi 差不多了,但是执行 'db.advertisers.find({"_id":id}, {"advertisers.lowered_name"})' 会得到一个过滤后的结果,我猜如果我执行 'print(cursor[advertisers])',我可以得到 '{"lowered_name" : "conair"}' 的输出。 - Reiion
@M.StyvaneSoukossi 啊,抱歉那个例子不太好。但基本上我的实现最多会查询2个文档,因此需要循环 :) - Reiion
显示剩余2条评论
1个回答

3
使用Pymongo,因为Pymongo使用字典表示文档,所以无法使用“点符号”访问嵌入字段。
for item in db.advertisers.find({"advertisers.lowered_name" : "conair"}, {"advertisers.lowered_name": 1}):
    print(item["advertisers"]["lowered_name"])

您也可以使用 .distinct 方法,但请注意,它只会返回唯一的“lowered_name”列表。

for item in db.advertisers.distinct("advertisers.lowered_name", {"advertisers.lowered_name" : "conair"}):
    print(item)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接