在一个页面中使用mongoDB集合两次

时间:2018-05-30 07:10:03

标签: python mongodb flask

Hi2all! 我有: 1)mongo集合:

PSComputerName

2)带有视图的烧瓶应用程序:

[{_id:ObjectId("5b0d5fb624d22e1b4843c06b")
collectionName:"collection0"
collectionCaption:"caption1"}

{_id:ObjectId("5b0d5fb824d22e1b4843d4c1")
collectionName:"collection1"
collectionCaption:"caption1"}

{_id:ObjectId("5b0d5fb924d22e1b4843d74a")
collectionName:"collection2"
collectionCaption:"caption1"}

{_id:ObjectId("5b0d5fb924d22e1b4843d7b0")
collectionName:"collection3"
collectionCaption:"caption1"}]

3)模板:index.html女性扩展base.html。 base.html文件:

def index():
    a = mongo.db.collectionsNames.find()
    return render_template('index.html', collectionsNames=a)

的index.html:

{% extends "bootstrap/base.html" %} 
{% block content %}
    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
        {% for asd in collectionsNames %}
            <a class="dropdown-item" href="/{{ asd["collectionName"] }}">{{ asd["collectionCaption"] }}</a>
        {% endfor %}

    </div>
    {% block contentBase %} {% endblock %}
{% endblock %}

问题是:为什么如果base和index使用相同的集合变量,索引模板什么都不显示?

但是如果在视图代码中是:

{% extends "base.html" %}
{% block contentBase %}
    {% for zxc in collectionsNames %}
        {{ zxc["collectionName"] }}
    {% endfor %}
{% endblock %}

在模板中我使用不同的变量,索引模板显示数据。

1 个答案:

答案 0 :(得分:0)

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 返回一个光标:mongo.db.collectionsNames.find()给出print(mongo.db.collectionsNames.find())

为了简化(但有点错误),游标是一种特定类型的实例,它通过块从数据库块中获取数据,因此如果你想要db中的1 000 000个第一项,你实际上并不存储RAM中的1M项目,您可以100个项目(例如)迭代100个项目。光标以神奇的方式处理它。

无论如何,你不能在同一个光标上循环几次,你不应该把光标放到像<pymongo.cursor.Cursor object at 0x7fd3854d5710>那样的列表中(因为如果你的查询要求提供1M产品,那么这样就可以将所有这些产品添加到RAM中)。 / p>

所以,现在,你怎么能处理这个问题。大多数时候我会说在你需要的时候调用这个方法会更好,如果需要的话可以两次。

但是你在Jinja环境中,如果我在Jinja模板中调用方法是不可能的。

这样做的一种方法是使用属性。

list(cursor_instance)

然后,在您的模板中:

class LazyCollection(object):

    @property
    def collections_names(self):
         return mongo.db.collectionsNames.find()


lazycoll = LazyCollection()
return render_template('index.html', collectionsNames=lazycoll)