标签: pymongo

pymongo:优雅地删除记录

这是我使用pymongo删除一堆记录的代码

ids = []
with MongoClient(MONGODB_HOST) as connection:
    db = connection[MONGODB_NAME]
    collection = db[MONGODN_COLLECTION]
    for obj in collection.find({"date": {"$gt": "2012-12-15"}}):
        ids.append(obj["_id"])
    for id in ids:
        print id
        collection.remove({"_id":ObjectId(id)})
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来删除这些记录?比如直接删除一整套记录

collection.find({"date": {"$gt": "2012-12-15"}}).delete() or remove()
Run Code Online (Sandbox Code Playgroud)

或者从obj中删除

 obj.delete() or obj.remove()
Run Code Online (Sandbox Code Playgroud)

或类似的?

python mongodb pymongo

22
推荐指数
2
解决办法
4万
查看次数

如何隐藏聚合中的_id?

我有这个问题:

produits = yield motor.Op(db.users.aggregate, [{"$unwind":"$pup"},{"$match":{"pup.spec.np":nomp}}, {"$group":{"_id":"$pup.spec.id","pup":{"$push":"$pup"}}}])
Run Code Online (Sandbox Code Playgroud)

结果给了我这个:

print produits

{u'ok': 1.0, u'result': [{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}]}
Run Code Online (Sandbox Code Playgroud)

所以我能做到:

prod = produits["result"]

[{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}]
Run Code Online (Sandbox Code Playgroud)

但我怎么隐藏"_id"所以我只能得到

[{u'pup': [{u'avt': {u'fto': ..all the results}}]}]
Run Code Online (Sandbox Code Playgroud)

在正常的查询中,我只是添加类似{"_id":0}这里的东西它不起作用.

mongodb motordriver pymongo tornado-motor

22
推荐指数
2
解决办法
2万
查看次数

ImportError:没有名为'pymongo'的模块

我在使用Python 3.4,mongodb 4.2.10在Win 7(64)上运行pymongo时遇到问题.错误输出如下:

import pymongo
ImportError: No module named 'pymongo'
Run Code Online (Sandbox Code Playgroud)

代码非常简单:

import pymongo
from pymongo import MongoClient

client=MongoClient()
db=client.test_db
dict={'A':[1,2,3,4,5,6]}
db.test_collection.insert(dict)
to_print=db.test_collection.find()
print(to_print)
Run Code Online (Sandbox Code Playgroud)

我试过已经重新安装Python和MongoDB - 没有帮助.当我在cmd中手动执行它时,它工作,即mongod.exe和mongo.exe工作正常.似乎pymongo有问题,但我不知道如何解决它.

python mongodb pymongo

22
推荐指数
6
解决办法
6万
查看次数

MongoDB查询:字段要么不存在要么具有特定值

我想查询mongo集合中的记录,这些记录要么没有名为'scheme'的字段的值,要么显式为'scheme'赋值'http'.听起来很简单,但事实证明这个问题比最初出现的问题更复杂.

因为db.collection.find({'scheme': None})返回'scheme'未定义的所有记录(没有索引字段),我最初认为以下内容可行:

db.collection.find({'scheme': {'$in': ['http', None]}})
Run Code Online (Sandbox Code Playgroud)

但是,这似乎排除了'scheme'未定义的值,因此我只能假设它正在搜索其中scheme为'http'或明确定义为的记录None.这似乎有点违反直觉,但我们有它.我的第二次尝试如下:

db.collection.find( {'$or': [{'scheme': {'$exists': False}}, {'scheme': 'http'}]})
Run Code Online (Sandbox Code Playgroud)

这也排除了方案未定义的结果.这一次,我甚至无法想到为什么失败的逻辑原因.

任何想法为什么会失败,以及如何让它按照需要运作?

谢谢

编辑:我以为我注意到我正在通过Python(pymongo)执行此查询,这解释了None(通过Javascript的null)

mongodb pymongo

21
推荐指数
1
解决办法
1万
查看次数

在不区分大小写的情况下有效地查询MongoDB(通过pymongo)

我目前正在创建一个python(金字塔)网站,要求用户注册并登录.系统允许用户选择一个用户名,可以是大写字母,小写字母和数字的混合.

确保两个用户不会意外地共享相同的用户名时出现问题,即在我的系统中,"randomUser"应该与"RandomUser"或"randomuser"相同.

不幸的是(在这种情况下)因为Mongo将字符串存储为区分大小写,因此可能会有许多用户使用"相同"的用户名.

我知道查询mongo的不区分大小写的字符串的方法:

db.stuff.find_one({"foo": /bar/i});
Run Code Online (Sandbox Code Playgroud)

但是,这在使用pymongo的查询方法中似乎不起作用:

username = '/' + str(username) + '/i'
response = request.db['user'].find_one({"username":username},{"username":1})
Run Code Online (Sandbox Code Playgroud)

这是构造pymongo查询的正确方法(我假设没有)?

无论何时创建或登录用户帐户,都将使用此查询(因为它必须检查系统中是否存在用户名).我知道这不是最有效的查询,所以它是否仅用于登录或帐户创建是否重要?是否更愿意做一些事情,比如强迫用户只选择小写的用户名(完全不需要不区分大小写的查询)?

python case-insensitive mongodb pymongo

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

PyMongo - 游标迭代

我最近开始通过shell和PyMongo测试MongoDB.我注意到返回游标并尝试迭代它似乎是实际迭代中的瓶颈.有没有办法在迭代期间返回多个文档?

伪代码:

for line in file:
    value = line[a:b]
    cursor = collection.find({"field": value})
    for entry in cursor:
        (deal with single entry each time)
Run Code Online (Sandbox Code Playgroud)

我希望做的是这样的:

for line in file
    value = line[a:b]
    cursor = collection.find({"field": value})
    for all_entries in cursor:
        (deal with all entries at once rather than iterate each time)
Run Code Online (Sandbox Code Playgroud)

我已经尝试按照这个问题使用batch_size()并将值一直更改为1000000,但它似乎没有任何影响(或者我做错了).

任何帮助是极大的赞赏.这个Mongo新手请轻松一点!

---编辑---

谢谢迦勒.我想你已经指出了我真正想要问的问题,这就是:有什么方法可以进行排序collection.findAll()cursor.fetchAll()命令,就像cx_Oracle模块一样?问题不在于存储数据,而是尽可能快地从Mongo DB中检索数据.

据我所知,数据返回给我的速度由我的网络决定,因为Mongo必须单次获取每条记录,对吗?

python mongodb pymongo

21
推荐指数
2
解决办法
4万
查看次数

limit()和sort()命令pymongo和mongodb

尽管阅读了人们的答案,说明排序是先完成的,但证据显示的不同之处在于排序之前的限制.有没有办法强制排序总是先?

views = mongo.db.view_logging.find().sort([('count', 1)]).limit(10)
Run Code Online (Sandbox Code Playgroud)

无论我使用.sort().limit()or .limit().sort(),限制都优先.我想知道这是否与pymongo...有关...

python mongodb pymongo

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

获取mongodb中所有唯一标签的列表

我开始使用mongodb并拥有一个包含如下文档的集合

{
    "type": 1,
    "tags": ["tag1", "tag2", "tag3"]
}
{
    "type": 2,
    "tags": ["tag2", "tag3"]
}
{
    "type": 3,
    "tags": ["tag1", "tag3"]
}
{
    "type": 1,
    "tags": ["tag1", "tag4"]
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我想要一特定类型的所有标签.例如,对于类型1,我想要tag1, tag2, tag3, tag4(任何顺序)的集合.

我能想到的只是获取标签并将它们添加到setpython中,但我想知道是否有办法用mongodb的mapreduce或其他东西来做.请指教.

mongodb pymongo

20
推荐指数
1
解决办法
8451
查看次数

在OS X上使用bson进行Flask ImportError

我无法使用Flask,MongoDB和Python来使用简单的Hello World应用程序.尝试从bson模块导入时,该应用程序正在轰炸.所有模块都已成功安装pip,我正在运行virtualenv,所以我不知道为什么我收到错误:ImportError: cannot import name BSON

这是我的示例应用代码:

import os
from flask import Flask
from flask import g
from flask import jsonify
from flask import json
from flask import request
from flask import url_for
from flask import redirect
from flask import render_template
from flask import make_response
import pymongo
from pymongo import Connection
from bson import BSON
from bson import json_util

app = Flask(__name__)

@app.route('/')
def hello():

    connection = Connection()
    # Get your DB
    db …
Run Code Online (Sandbox Code Playgroud)

python mongodb bson pymongo

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

我怎么能从Twitter的流媒体API中消费推文并将它们存储在mongodb中

我需要开发一个应用程序,让我跟踪推文并将它们保存在一个研究项目的mongodb中(因为你可能会收集,我是一个菜鸟,所以请耐心等待我).我发现这段代码通过我的终端窗口发送推文:

import sys
import tweepy

consumer_key=""
consumer_secret=""
access_key = ""
access_secret = "" 


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)

class CustomStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        print status.text

    def on_error(self, status_code):
        print >> sys.stderr, 'Encountered error with status code:', status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

sapi = tweepy.streaming.Stream(auth, CustomStreamListener())
sapi.filter(track=['Gandolfini'])
Run Code Online (Sandbox Code Playgroud)

有没有办法可以修改这段代码,以便不是让我的屏幕上有推文流,而是将它们发送到我的mongodb数据库?

谢谢

python twitter mongodb pymongo tweepy

20
推荐指数
2
解决办法
7469
查看次数