这是我使用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)
或类似的?
我有这个问题:
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}这里的东西它不起作用.
我在使用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有问题,但我不知道如何解决它.
我想查询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)
我目前正在创建一个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查询的正确方法(我假设没有)?
无论何时创建或登录用户帐户,都将使用此查询(因为它必须检查系统中是否存在用户名).我知道这不是最有效的查询,所以它是否仅用于登录或帐户创建是否重要?是否更愿意做一些事情,比如强迫用户只选择小写的用户名(完全不需要不区分大小写的查询)?
我最近开始通过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必须单次获取每条记录,对吗?
尽管阅读了人们的答案,说明排序是先完成的,但证据显示的不同之处在于排序之前的限制.有没有办法强制排序总是先?
views = mongo.db.view_logging.find().sort([('count', 1)]).limit(10)
Run Code Online (Sandbox Code Playgroud)
无论我使用.sort().limit()or .limit().sort(),限制都优先.我想知道这是否与pymongo...有关...
我开始使用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或其他东西来做.请指教.
我无法使用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) 我需要开发一个应用程序,让我跟踪推文并将它们保存在一个研究项目的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数据库?
谢谢