linkBG

linkBG 查看完整档案

北京编辑中国劳动关系学院  |  计算机应用技术 编辑北京知道创宇信息技术有限公司  |  实习生 编辑填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

linkBG 提出了问题 · 2017-05-17

Mogodb使用了文本索引,就不能使用复合索引?

是不是如果使用了文本索引,就不能使用复合索引?
因为我用了下面的查询语句但是只做了文本索引:

db.tests.find({$text:{$search:'zhangshan'},'age':5,'city':'beijing'}

通过explain查看,他是做了text的索引。然后再从这个索引中去过滤出其他条件的!
那么我该怎么做才能全部走索引呢?
我想到把所有字段建立一个text索引。因为数据量大,所以没有尝试,想问问这个可行吗?
谢谢


补充一下explain()

"executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 50424,
        "executionTimeMillis" : 510228,
        "totalKeysExamined" : 83546,
        "totalDocsExamined" : 167092,
        "executionStages" : {
            "stage" : "FETCH",
            "filter" : {
                "$and" : [
                    {
                        "age" : {
                            "$eq" : "5"
                        }
                    },
                    {
                        "city" : {
                            "$eq" : "beijing"
                        }
                    }
                ]
            },
            "nReturned" : 50424,
            "executionTimeMillisEstimate" : 509543,
            "works" : 167095,
            "advanced" : 50424,
            "needTime" : 116670,
            "needYield" : 0,
            "saveState" : 24418,
            "restoreState" : 24418,
            "isEOF" : 1,
            "invalidates" : 0,
            "docsExamined" : 83546,
            "alreadyHasObj" : 83546,
            "inputStage" : {
                "stage" : "TEXT",
                "nReturned" : 83546,
                "executionTimeMillisEstimate" : 509362,
                "works" : 167095,
                "advanced" : 83546,
                "needTime" : 83548,
                "needYield" : 0,
                "saveState" : 24418,
                "restoreState" : 24418,
                "isEOF" : 1,
                "invalidates" : 0,
                "indexPrefix" : {
                    
                },
                "indexName" : "banner_text",
                "parsedTextQuery" : {
                    "terms" : [
                        "ii"
                    ],
                    "negatedTerms" : [ ],
                    "phrases" : [ ],
                    "negatedPhrases" : [ ]
                },
                "textIndexVersion" : 3,
                "inputStage" : {
                    "stage" : "TEXT_MATCH",
                    "nReturned" : 83546,
                    "executionTimeMillisEstimate" : 509320,
                    "works" : 167095,
                    "advanced" : 83546,
                    "needTime" : 83548,
                    "needYield" : 0,
                    "saveState" : 24418,
                    "restoreState" : 24418,
                    "isEOF" : 1,
                    "invalidates" : 0,
                    "docsRejected" : 0,
                    "inputStage" : {
                        "stage" : "TEXT_OR",
                        "nReturned" : 83546,
                        "executionTimeMillisEstimate" : 509310,
                        "works" : 167095,
                        "advanced" : 83546,
                        "needTime" : 83548,
                        "needYield" : 0,
                        "saveState" : 24418,
                        "restoreState" : 24418,
                        "isEOF" : 1,
                        "invalidates" : 0,
                        "docsExamined" : 83546,
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "nReturned" : 83546,
                            "executionTimeMillisEstimate" : 1642,
                            "works" : 83547,
                            "advanced" : 83546,
                            "needTime" : 0,
                            "needYield" : 0,
                            "saveState" : 24418,
                            "restoreState" : 24418,
                            "isEOF" : 1,
                            "invalidates" : 0,
                            "keyPattern" : {
                                "_fts" : "text",
                                "_ftsx" : 1
                            },
                            "indexName" : "name_text",
                            "isMultiKey" : true,
                            "isUnique" : false,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 2,
                            "direction" : "backward",
                            "indexBounds" : {
                                
                            },
                            "keysExamined" : 83546,
                            "seeks" : 1,
                            "dupsTested" : 83546,
                            "dupsDropped" : 0,
                            "seenInvalidated" : 0
                        }
                    }

关注 3 回答 2

linkBG 回答了问题 · 2017-05-15

Mongodb的复合(组合)查询怎么看explain?

自己回答一下,上面有用到索引,但是只有一部分。
如果建立复合索引,将会更快的搜索到。
所以,组合搜索还是得用复合索引。

关注 2 回答 2

linkBG 提出了问题 · 2017-05-15

Mongodb的复合(组合)查询怎么看explain?

Mongodb的版本:v3.4

db.h.reateIndex({'port':1});
db.h.reateIndex({'geo.city':1});

在使用的时候

db.h.find({'port':'80','geo.city':'Taipei'},{'port':1,'geo.city':1,'geo.country':1})

explain('executionStats')

"executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 280952,
                "executionTimeMillis" : 10056,
                "totalKeysExamined" : 879232,
                "totalDocsExamined" : 879232,
                "executionStages" : {
                        "stage" : "PROJECTION",
                        "nReturned" : 280952,
                        "executionTimeMillisEstimate" : 9763,
                        "works" : 879233,
                        "advanced" : 280952,
                        "needTime" : 598280,
                        "needYield" : 0,
                        "saveState" : 6915,
                        "restoreState" : 6915,
                        "isEOF" : 1,
                        "invalidates" : 0,
                        "transformBy" : {
                                "port" : 1,
                                "geo.city" : 1,
                                "geo.country" : 1,
                        },
                        "inputStage" : {
                                "stage" : "FETCH",
                                "filter" : {
                                        "geo.city" : {
                                                "$eq" : "Taipei"
                                        }
                                },
                                "nReturned" : 280952,
                                "executionTimeMillisEstimate" : 9246,
                                "works" : 879233,
                                "advanced" : 280952,
                                "needTime" : 598280,
                                "needYield" : 0,
                                "saveState" : 6915,
                                "restoreState" : 6915,
                                "isEOF" : 1,
                                "invalidates" : 0,
                                "docsExamined" : 879232,
                                "alreadyHasObj" : 0,
                                "inputStage" : {
                                        "stage" : "IXSCAN",
                                        "nReturned" : 879232,
                                        "executionTimeMillisEstimate" : 466,
                                        "works" : 879233,
                                        "advanced" : 879232,
                                        "needTime" : 0,
                                        "needYield" : 0,
                                        "saveState" : 6915,
                                        "restoreState" : 6915,
                                        "isEOF" : 1,
                                        "invalidates" : 0,
                                        "keyPattern" : {
                                                "port" : 1
                                        },
                                        "indexName" : "port_1",
                                        "isMultiKey" : false,
                                        "multiKeyPaths" : {
                                                "port" : [ ]
                                        },
                                        "isUnique" : false,
                                        "isSparse" : false,
                                        "isPartial" : false,
                                        "indexVersion" : 2,
                                        "direction" : "forward",
                                        "indexBounds" : {
                                                "port" : [
                                                        "[\"80\", \"80\"]"
                                                ]
                                        },
                                        "keysExamined" : 879232,
                                        "seeks" : 1,
                                        "dupsTested" : 0,
                                        "dupsDropped" : 0,
                                        "seenInvalidated" : 0
                                }
                        }
                }

像上面的例子,除了端口使用了索引吗?还是两个都使用了,如果两个都使用了,那还要建立复合索引吗?
谢谢

关注 2 回答 2

linkBG 提出了问题 · 2017-05-13

解决Mongodb索引的优化?

不清楚索引村不存在优化的情况。对于索引理解没有深入。顺便帮忙讲解一下吧!

1,每条数据都有地理信息。(省,市),那么我建立了索引:

db.v.createIndex({city:1}
db.v.createIndex({area:1}

我的疑惑是,这个建立的时候是没有条数据建立一个索引值还是通过索引的值来建立?

    比如存在这样的数据
    id name         city         area 
    1  zhangsan     beijing      beijing
    2  lisi         shanghai     shanghai
    3  zhaowu       beijing      beijing

   #每条数据建立 
    city->beijing->1
    city->shanghai -> 2
    city->beijing->3
    
    #还是根据索引值
    city->beijing--|-> 1
                   |-> 3
    city->shanghai->2
    
    

谢谢

关注 3 回答 2

linkBG 提出了问题 · 2017-05-13

如何优雅的升级线上Django代码?

现有的部署,之前通过scp上传到服务器上,服务器上禁止使用git。然后每次新的代码要同步都需要scp一下。然后就想怎么才能很好的实现类git那样?前提是不能使用版本控制软件!!!
谢谢。

关注 6 回答 5

linkBG 提出了问题 · 2017-05-11

Mongodb优化?

现在场景是:机器的性能是cpu很nb。i7忘记型号。nb是说几乎在查询的时候cpu的操作很少。通过htop来看。但是内存这块不行,只有8g,之后肯定会增加内存。硬盘也是普通机械盘,之后也会换,但是那是之后的事情,现在能感觉的是,当查询数据大于10万的情况,瓶颈出现在io上,io被锁了,内存在占用量也是满高的。导致其他操作很卡,虽然这个影响小,但是体现在web方面就是页面等待时间长。
目前做了如下的优化:
1,调整linux stack size数值。
2,建立索引。
3,把一些数据比较热门,近期(1个月)没有修改的数据单独一个集合。
通过上面三个来优化,情况也好点。但是还是会出现问题,当查询的时候多条件时,索引就无效了。情况还是一样糟糕。
所以,很是矛盾。怎么才能很好的处理?那如果还有一台一样配置的服务器那通过分片之类的操作能不能解决这种情况呢?

谢谢

关注 3 回答 2

linkBG 提出了问题 · 2017-05-10

解决Javascript的引号问题?

问题不知道怎么表达。直接上code

  xAisdata.push("(u'Chunyang', 9)")
        
  xAisdata.push("(u"Fu'an", 505)")#值中的"和外面的"冲突了。
        
  xAisdata.push("(u'Huwei', 250)")
        
  xAisdata.push("(u'Tainan City', 66926)")
        
  xAisdata.push("(u'Dacang', 868)")
        

要加入数组的值是数据库取回来的值。所以,更改这个值可能不太现实。请问该怎么处理这种情况?谢谢


{% for k,v in data %}
            xAisdata.push("{{ k | safe}}");
{% endfor %}

{% %}是Django的模板语法

关注 3 回答 2

linkBG 赞了回答 · 2017-05-05

解决Python异常退出时保存进度?

你说的这几种异常情况, 都是程序接收到相应信号, 采取默认动作(退出)导致的, 所以可以通过注册信号, 改变默认动作来避免程序异常退出.

import signal
import time

def hander(signum, frame):
    # 接受到信号后你想做的事
    print signum, frame

signal.signal(signal.SIGTERM, hander)  # 捕获kill : SIGTERM信号
signal.signal(signal.SIGINT, hander)   # 捕获Ctrl-c: SIGTERM 信号(可以绑定不同的函数)
signal.signal(signal.SIGTSTP, hander)  # 捕获 Ctrl-z: SIGTSTP信号(可以绑定不同的函数)
while 1:
    time.sleep(1)

经过上面的signal将对应的信号动作绑定到hander函数, 在接受到Ctrl-c , kill , Ctrl-z都能分别执行handler的代码了, 至于想怎么实现, 可以自定义, 如果除了这些信号意外的情况, 得示其他情况而决定采取什么措施! 可以学习下python signal相关的知识(有个别信号无法捕获, 这是系统决定的, 需要注意)

关注 3 回答 3

linkBG 提出了问题 · 2017-05-04

解决Python异常退出时保存进度?

问题:
读取文本生成list。在程序运行时list.pop()。现在想要说,能不能在异常退出的时候,将list中的值重新写入文本中。
异常情况:
Ctrl-c , kill , Ctrl-z
谢谢!

关注 3 回答 3

linkBG 赞了回答 · 2017-05-03

解决Python中怎么实现1:n:1的数据结构?

第一个: 如果在同一类型前提下, 第一个值是唯一的话, 那么可以试下下面的结构:

value = '1:n:1'
mapping = defaultdict(dict)
value_type, fir_val, sec_val = value.split(':')
mapping = {
    value_type: {
        fir_val: sec_val 
    }
}

上面的意思就是, 创建一个默认值为字典的字典mapping, 然后用类型第一个值分别作为索引的key, 我个人觉得, 在类型第一个值的共同约束下, 找到的第二个值应该是唯一的, 如果不是唯一的, 那么就要考虑是否覆盖, 还是以列表的形式存在

第二个:
如果你采用我上面的数据结构, 那么你在不知道第一个值的前提下, 只能遍历mapping[value_type], 然后判断值是否你想要的

关注 4 回答 3

linkBG 提出了问题 · 2017-05-03

解决Python中怎么实现1:n:1的数据结构?

首先有大量的数据,数据的分为3个单元组成:

类型    第一个值    第二值

比如现在有100条这样的数据。如何处理呢?
第一步
我的想法就是通过字典来构建1:n:1。
但是,现在情况是。如果类型为key的话,那么如果有相同类型要怎么处理?因为字典的key是唯一的。

第二步的情况是,我要通过第一个值来获取第二值。我要怎么才能在不知道第一个值的情况下通过第一个值来获取第二个值?

谢谢!~


可能表达不清楚,我举例说明一下1:n:1的
比如有两条数据是这样的

        类型        第一个值        第二个值
 (1)   zhangsan   2017-01-01     是的我来了
 (2)   zhangsan   2017-05-01     我要走了

然后我想要组成这样的东西:

    'zhangsan':{{'2017-01-01': '是的我来了'},{'2017-05-01':'我要走了'}}

这是我想要的结果。
也就是说。1:n:1表示 类型:第一个值:第二个值
不知道有没有可行的方案

关注 4 回答 3

linkBG 提出了问题 · 2017-04-30

正则中的替代问题

问题是:

有没有更优雅的方式来表达[\w\W]的方式。

例如:

要匹配的字符串:
abc-def

如果我这样写:
[\w]+
是匹配不到的。

还有[\S\s]和上面的情况一样。有可以替代的办法吗?
谢谢

关注 5 回答 4

linkBG 提出了问题 · 2017-04-26

pymongo中游标的使用

问题:
我需要多次使用同一个游标。然后发现一个for循环这个游标就没有用了。
然后我使用了

a = db.base.find()
c = b = a 

但是a for循环之后b,c都不能用了。
之后又想到用深度拷贝:

import copy
a = db.base.find()
b = copy.deepcopy(a)
c = copy.deepcopy(a)

这样就可以使用。
但是这样会不会增加内存的使用~!

请问怎么使用才是最优美的呢?谢谢

关注 2 回答 1

linkBG 提出了问题 · 2017-04-24

Django 下怎么做日志审查

现有的系统下,要增加一个日志审计。

现有的环境: Django+Mongodb 。

然后想直接用 logging 来处理日志,但是怎么入库呢?

看到网上也有人讨论 signals 来处理,这个块不是很熟,想问一下,只处理 views 可以吗,因为现有的环境没有 models 的处理。 谢谢

关注 3 回答 2

linkBG 提出了问题 · 2017-04-10

解决Python处理Dict生成json

情况是这样:
json文件中存在一个值为

"headers":{
    "connection":["close"],
    "content_language":["en"],
    "content_length":["3137"],
    "content_type":["text/html"],
    "server":["squid/3.1.23"],
    "unknown":[
      {"key":"mime_version","value":["1.0"]},
      {"key":"date","value":["Sat, 25 Mar 2017 06:11:38 GMT"]},
      {"key":"x_squid_error","value":["ERR_INVALID_URL 0"]},
      {"key":"x_cache","value":["MISS from unknown"]},
      {"key":"x_cache_lookup","value":["NONE from unknown:8080"]}
    ]
}

由于之前的脚本的处理过于简单粗暴。现实要将"unknown"给替换成字典中的值。
以下是我处理的一段Test code ,在Ipython中:

import json
f = open('file.json','r')
test_line = f.readline()
jsonstr = json.loads(test_line)

he = jsonstr['headers']
# 输出正常的
for (k,v) in he.items():
    print k,':',v[0]

输出的是:

    "connection":"close",
    "content_language":"en",
    "content_length":"3137",
    "content_type":"text/html",
    "server":"squid/3.1.23",
    "unknown":[
      {"value":["1.0"],"key":"mime_version"}

问题:
1, 怎么处理“unknown”中的list,用for的话,怎么输出?
2, 怎么处理“unknown”使其能输出如下的结果:

    "connection":"close",
    "content_language":"en",
    "content_length":"3137",
    "content_type":"text/html",
    "server":"squid/3.1.23",
    "mime_version":"1.0",
    "date":"Sat, 25 Mar 2017 06:11:38 GMT",
    "x_squid_error":"ERR_INVALID_URL 0",
    "x_cache":"MISS from unknown",
    "x_cache_lookup":"NONE from unknown:8080"

谢谢!~

关注 5 回答 3

linkBG 提出了问题 · 2017-04-08

Django分页和查询参数的问题

查询是通过get的方式,之前没有分页之前,url是这样的:

http://hostname/search?query=port%3A8080

那么我的想法是如果分页了。

1,不带page参数了。next之后就加载下一页的内容

http://hostname/search?query=port%3A8080

请问这个是通过post传参吗?

2,
使用官方文档中的(目前的方案)

    http://hostname/search?query=port%3A8080?page=2

但是,在现实情况下。?page=2 就替代了?query=port%3A8080 变成了这样:

http://hostname/search?page=2

请问这这种情况怎么处理?
urls.py

    url(r'^search$', views.show_results, name='results'),

谢谢

关注 2 回答 1

linkBG 赞了回答 · 2017-04-06

MongoDB的模糊查询

请参考MongoDB的全文检索(Text Search)功能。

官方文档的链接如下:

https://docs.mongodb.com/manu...

供参考。

Love MongoDB!Have Fun!

关注 3 回答 1

linkBG 回答了问题 · 2017-04-06

解决Pymongo 中 update 的错误

另外 update 已经被 deprecated ,推荐使用 update_one() 或者 update_many()
https://docs.mongodb.com/gett...

关注 2 回答 2

linkBG 提出了问题 · 2017-04-05

Django导出数据csv格式

对于官方的例子是明白的。但是放在实际的情况,就有点不明白。首先,我已经展示出数据了,那么在这个前端页面上我怎么把数据传到后端呢?ajax?那么我该传什么值?
例如我有如下的显示数据。

{% for c, cs in allCountrys %}
<div class="left-results-count">
    <div class="col-md-8 name">{{ c }}</div>
    <div class="col-md-4 count">{{ cs }}</div>
</div>
{% endfor %}

然后我就要导出c, cs。我是不是通过ajax传allCountrys?还是怎么弄?

谢谢

关注 3 回答 2

linkBG 提出了问题 · 2017-04-05

解决Pymongo 中 update 的错误

首先是代码:

DB.test.update(query={'host': ip, 'port': port}, update={$set: {'http': 'test'}})

这个代码会报这样的错误:

TypeError: 'update() takes at least 3 arguments (1 given)

在这个之前我使用了最最简单的:

DB.test.update({'host': ip, 'port': port}, {"$set": {'http': 'test'}})

报的错误:

TypeError: "unhashable type: 'dict'"

我一脸的蒙蔽阿。什么情况。 这个是问题是在这个主题的一个简单解决方案。这情况怎么解决?

关注 2 回答 2