标签: pymongo-3.x

在mongodb嵌入式文档中添加新属性(在最新的数组项中)

我有如下的mongo文件:

{
        "_id" : ObjectId("59ccb655071d4c2ceebe190c"),
        "session_deatils" : [
                {
                        "session_start" : 1,
                        "session_complete" : 1,
                        "started_at" : ISODate("2017-09-28T08:42:19.770Z"),
                        "event_count" : 2
                },
                {
                        "session_start" : 1,
                        "session_complete" : 1,
                        "started_at" : ISODate("2017-09-28T08:53:08.618Z"),
                        "event_count" : 1
                },
                {
                        "session_start" : 1,
                        "session_complete" : 1,
                        "started_at" : ISODate("2017-09-28T09:19:42.726Z")
                }
        ],
        "session_id" : "12312312313123",
}
Run Code Online (Sandbox Code Playgroud)

我想在会话详细信息的最新项目中添加新字段和值,例如“ event_count”

        {
                "session_start" : 1,
                "session_complete" : 1,
                "started_at" : ISODate("2017-09-28T09:19:42.726Z")
        }

            and I want to update it and the array element should look like below:

        { …
Run Code Online (Sandbox Code Playgroud)

mongodb pymongo mongodb-query aggregation-framework pymongo-3.x

5
推荐指数
0
解决办法
134
查看次数

有没有办法在Pymongo 3.0中跳过insert_many的现有_id?

我正在更新一个拥有数百万个文档的数据库,其中包含少于10个_id冲突.

我目前正在使用PyMongo模块使用insert_many执行批量插入:

  1. 查询数据库以查看_id是否存在
  2. 如果_id不存在,则将文档添加到数组中
  3. 使用insert_many一次插入数据库,一次1000个文档.

几百万个文档中只有大约10个冲突,我正在查询每个_id的数据库.我认为如果我可以删除查询过程,我可以减少一到两天的总插入时间.

是否存在类似于upsert的东西,如果它不存在则只插入文档?

performance mongodb pymongo pymongo-3.x

4
推荐指数
1
解决办法
2325
查看次数

Pymongo的update_one()返回带有AttributeError的UpdateResult

我刚刚将MongoDB和Pymongo升级到最新版本3.2.1,以便在调用update_one()后能够使用UpdateResult对象.但由于某种原因,返回的对象有一个包含AttributeError的字段.

看看我的Pycharm屏幕.你可以看到_UpdateResult__已经确认

'Traceback (most recent call last):
  File "/opt/pycharm-community-5.0.4/helpers/pydev/pydevd_resolver.py", line 191, in _getPyDictionary
    attr = getattr(var, n)
AttributeError: _UpdateResult__acknowledged'
Run Code Online (Sandbox Code Playgroud)

它导致我的问题,因为我试图捕获所有异常,每次我需要在我的代码中使用update_one()我得到这个异常.

这是我的代码片段:

QUERY = {id: '1234'}
try:
    record = mongoCollection.find_one(QUERY)
    if record is None:
        print 'Add new Record'
    else:
        updateResult = mongoCollection.update_one(
            QUERY,
            {'$addToSet': {'info': getInfo()}}
        )

        if updateResult['modified_count'] == 1:
            mongoCollection.update_one(
                QUERY,
                {'$inc': {'infoCount': 1}}
            )
        print 'Record exists, updating if needed'
except:
    print 'Failed to add/update'
Run Code Online (Sandbox Code Playgroud)

幸运的是,我能够找到一个不会导致引发此异常的变通方法.而不是使用update_one(),我可以使用不推荐的函数update() …

python mongodb pymongo pycharm pymongo-3.x

4
推荐指数
1
解决办法
5609
查看次数

在pymongo中使用explain(“ executionStats”)进行查询

我的要求有问题,包括解释。举例来说,以下要求非常有效:

pp.pprint(col.find({"cuisine":"Italian"}, {"name" : 1, "address.zipcode" :   1, "address.coord" : 1}).explain())
Run Code Online (Sandbox Code Playgroud)

说明方法的项目清单印刷得很好。

但是,当我只需要带有以下请求的explain()方法中的executionStats项时:

pp.pprint(col.find({"cuisine":"Italian"}, {"name" : 1, "address.zipcode" : 1, "address.coord" : 1}).explain("executionStats"))
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

TypeError: explain() takes 1 positional argument but 2 were given
Run Code Online (Sandbox Code Playgroud)

有谁知道这是怎么回事,以及如何解决这个问题?

ty

python mongodb pymongo-3.x

3
推荐指数
2
解决办法
2825
查看次数

mongodb 通配符匹配特定键的所有值

我想弄清楚如何匹配一个键并返回该键的所有值。是否可以将值作为通配符给出?我想在值上使用通配符返回该特定键的所有内容。

db.collection.find({"key" :"*"})
Run Code Online (Sandbox Code Playgroud)

此外,我希望这也能返回整个集合,该集合的键也与通配符值匹配。

mongodb pymongo mongodb-query pymongo-3.x

3
推荐指数
1
解决办法
3562
查看次数

在python中使用partialFilterExpression创建索引

我使用下面的代码在 mongodb 中为具有空值的记录创建部分索引。当我执行下面的代码时。

    db = self.db_conn[db_name ]
    collection = db[collection_name]
    status = collection.create_index([("Col1", pym.ASCENDING), ("Col2", pym.ASCENDING)], {partialFilterExpression : {"value": None}})
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误:

 "name 'partialFilterExpression' is not defined"
Run Code Online (Sandbox Code Playgroud)

我的pymongo版本3.2.2 Mongodb版本3.4

python mongodb pymongo pymongo-3.x

3
推荐指数
1
解决办法
1731
查看次数

如何在 Pymongo 中查询列表

我在 Python 中有这个代码:

import datetime
import re
import pymongo
from datetime import timedelta, date

def daterange(d, d1):
    for n in range(int ((d1 - d).days)):
        yield d + timedelta(n)

#conect to db
uri = "mongodb://127.0.0.1:27017"
client = pymongo.MongoClient(uri)
database = client['db']
collection = database['currency']


d = input('Insert beginning date (yyyy-mm-dd): ')
d1 = input('Insert end date (yyyy-mm-dd): ')

#search db
item = collection.find_one({"date" : d})
item1 = collection.find_one({"date" : d1})
d = collection.find_one({})
d1 = collection.find_one({})
datas = item['date']
datas1 = …
Run Code Online (Sandbox Code Playgroud)

mongodb pymongo python-3.x pymongo-3.x

3
推荐指数
1
解决办法
3614
查看次数

ServerSelectionTimeoutError Pymongo

我是第一次尝试 pymongo,但一直收到 ServerSelectionTimeoutError。使用 mongo 命令行登录时,我运行如下命令

$ mongo-3.0 --ssl test.net:27080/db_qa --sslAllowInvalidCertificates -u content -p
MongoDB shell version: 3.0.12
Enter password:
Run Code Online (Sandbox Code Playgroud)

我可以正常连接,但是使用 pymongo 时出现错误

pymongo.errors.ServerSelectionTimeoutError: test.net:27080: [Errno 60] Operation timed out
Run Code Online (Sandbox Code Playgroud)

我的代码如下

from pymongo import MongoClient

client = MongoClient('mongodb://content:<password>@test.net:27080/db_qa')
client.server_info()
Run Code Online (Sandbox Code Playgroud)

python pymongo pymongo-3.x

3
推荐指数
1
解决办法
6785
查看次数

如何使用 PyMongo 检索感知时区日期时间对象

我面临 PyMongo 3.9 和日期时间对象的问题。在我的 MongoDB 4.x 服务器中,我有一个像这样的文档:

{
    "_id" : 2,
    "status" : "Running",
    "start_date" : ISODate("2020-11-19T05:03:54.576Z")
}
Run Code Online (Sandbox Code Playgroud)

如您所见,start_date位于 UTC 时区,但是当我使用 PyMongo 检索文档时,时区丢失了:

db.get_collection('my_collection').find_one({'_id': {'$eq': 2}})
Run Code Online (Sandbox Code Playgroud)

我在这里读到https://pymongo.readthedocs.io/en/stable/api/bson/codec_options.html Mongo默认返回一个天真的时区日期时间,为了获得一个意识时区日期时间,我应该添加这个选项到查询:

opts=CodecOptions(tz_aware=True)
db.get_collection('my_collection', codec_options=opts).find_one({'_id': {'$eq': 99}})
Run Code Online (Sandbox Code Playgroud)

但这意味着依赖开发人员的记忆来记住将此选项添加到每个查询中。所以我的问题是:有没有什么方法可以配置 MongoDB、PyMongo 或其他任何东西来始终返回感知时区日期时间对象?

太感谢了!

datetime mongodb python-3.x pymongo-3.x

3
推荐指数
1
解决办法
1552
查看次数

如何在 Pymongo 3.2+ 中获取 replSetGetStatus?

我目前正在转换 pymongo 3.2+ 驱动程序的更高级别 api。该代码可以在 pymongo 2+ 到 3.1 中运行。我正在尝试检索管理数据库的 replSetGetStatus 。

据我了解 pymongo 3.2+ 不允许查询管理数据库。我用谷歌搜索了一下,并没有发现关于这个主题的信息。有提示表明我需要使用 db.runCommand() 方法,但我不确定如何执行此操作。

我的旧 pymongo 2+ - 3.1 代码。

#connection = MongoClient
status = connection.admin['$cmd'].find_one({'replSetGetStatus': 1})
Run Code Online (Sandbox Code Playgroud)

我将如何将该行代码转换为与 pymongo 3.2+ 一起使用?

python mongodb pymongo pymongo-3.x

2
推荐指数
1
解决办法
703
查看次数