如何将find()嵌套文档用于两个或更多级别?

时间:2018-03-01 14:10:26

标签: python sql database mongodb

这是我的示例mongodb数据库

database image for one object

以上是一个包含文章数组的数据库。为简单起见,我只获取了一个对象。

database image for multiple objects ( max 20 as it's the size limit )

我有大约18k这样的条目。 我必须提取(文章和0)子章节中的描述标题标记。 find()方法就是这里的问题..我试过这个:

for i in db.ncollec.find({'status':"ok"}, { 'articles.0.title' : 1 , 'articles.0.description' : 1}):
    for j in i:
        save.write(j)

执行代码后, save 文件包含:

_id
文章
_id
制品

它继续......

有关如何打印上述内容的任何帮助?

我的整个代码供参考:

    import json
    import newsapi
    from newsapi import NewsApiClient
    import pymongo
    from pymongo import MongoClient

    client = MongoClient()
    db = client.dbasenews
    ncollec = db.ncollec


    newsapi = NewsApiClient(api_key='**********')
    source = open('TextsExtractedTemp.txt', 'r')
    destination = open('NewsExtracteddict.txt', "w")
    for word in source:
        if word == '\n':
            continue
        all_articles = newsapi.get_everything(q=word, language='en', page_size=1)
        print(all_articles)
        json.dump(all_articles, destination)
        destination.write("\n")
        try:
            ncollec.insert(all_articles)
        except:
            pass

1 个答案:

答案 0 :(得分:1)

好的,所以我查了一下来更新我对pymongo的生锈记忆,这就是我找到的。

正确的查询应该是:

db.ncollec.find({ 'status':"ok", 
                  'articles.title' : { '$exists' : 'True' },
                  'articles.description' : { '$exists' : 'True' } })

现在,如果你这样做:

query = { 'status' : "ok",
          'articles.title' : { '$exists' : 'True' },
          'articles.description' : { '$exists' : 'True' } }
for item in db.ncollect.find(query):
    print item

并且它没有显示任何内容,查询是正确的,但您没有正确的数据库,或正确的树,或其他任何内容。

但我向你保证,你向我展示了数据库,如果你这样做......

query = { 'status' : "ok",
          'articles.title' : { '$exists' : 'True' },
          'articles.description' : { '$exists' : 'True' } }
for item in db.ncollect.find(query):
    save.write(item[0]['title'])
    save.write(item[0]['description'])

首先,它会做你想做的事。

现在,键item[0]可能不太好,但为此,我无法提供任何帮助,因为它是在屏幕上显示的。 :)

好的,现在。我找到了一些有点复杂的东西,但很酷:) 但我不确定它是否适合你。我怀疑你给了我们一棵错误的树,因为当你做.find( {'status' : 'ok'} )时,它没有返回任何内容,它应该返回带有'status' : 'ok'所有文件,因为你有很多......

无论如何,这是一个查询,您应该使用 .aggregate() 方法,而不是.find()

elem = { '$match' : { 'status' : 'ok', 'articles.title' : { '$exists' : 'True'}, 'articles.description' : { '$exists' : 'True'}} }
[ elem, { '$unwind' : '$articles' }, elem ]

如果您想了解其工作原理,我邀请您read this page

此查询将仅返回数组中具有标题和描述且状态为OK的元素。如果元素没有标题或描述,则会被忽略。