关于python:如何使用PyMongo将索引从一个集合复制到另一个集合?

How do I copy the indexes from one collection to another collection using PyMongo?

在另一个问题中(如何使用PyMongo将集合从一个数据库复制到同一服务器上的另一个数据库?),我弄清楚了如何将一个MongoDB集合复制到同一服务器上的另一个数据库。 但是,这不会复制源集合上的索引,那么如何复制那些索引呢?


因此,使用简化的设置如下:

1
2
3
4
from pymongo import MongoClient
client = MongoClient()
client.db1.coll1.insert({'content':'hello world'})
client.db1.coll1.create_index(keys='content')

我们可以看到它具有一个自定义索引:

1
2
3
>>> client.db1.coll1.index_information()
{u'_id_': {u'key': [(u'_id', 1)], u'ns': u'db1.coll1', u'v': 1},
 u'content_1': {u'key': [(u'content', 1)], u'ns': u'db1.coll1', u'v': 1}}

然后,我通过如下复制数据来创建第二个集合coll2

1
client.db1.coll1.aggregate([{'$out':'coll2'}])

然后,以下内容似乎可用于复制索引:

1
2
for name, index_info in client.db1.coll1.index_information().iteritems():
    client.db1.coll2.create_index(keys=index_info['key'], name=name)

我担心,由于coll2已经具有主键索引'_id',所以这可能会导致错误,但它看起来像这样工作:

1
2
3
>>> client.db1.coll2.index_information()
{u'_id_': {u'key': [(u'_id', 1)], u'ns': u'db1.coll2', u'v': 1},
 u'content_1': {u'key': [(u'content', 1)], u'ns': u'db1.coll2', u'v': 1}}

1
2
3
4
5
6
for name, index_info in db_1.collection_x.index_information().items():
    keys = index_info['key']
    del(index_info['ns'])
    del(index_info['v'])
    del(index_info['key'])
    db_2.collection_y.create_index(keys, name=name, **index_info)