1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/**
* Basic test around rename collection
*
* @tags: [
* requires_fcv_50,
* requires_non_retryable_commands,
* assumes_no_implicit_collection_creation_after_drop
* ]
*/
(function() {
"use strict";
const collNamePrefix = "rename_coll_test_";
let collCounter = 0;
function getNewCollName() {
return collNamePrefix + collCounter++;
}
function getNewColl() {
let coll = db[getNewCollName()];
coll.drop();
return coll;
}
jsTest.log("Rename collection with documents (create SRC and then DST)");
{
const src = getNewColl();
const dstName = getNewCollName();
src.save({x: 1});
src.save({x: 2});
src.save({x: 3});
assert.eq(3, src.countDocuments({}));
assert.commandWorked(src.renameCollection(dstName));
assert.eq(0, src.countDocuments({}));
const dst = db[dstName];
assert.eq(3, dst.countDocuments({}));
dst.drop();
}
jsTest.log("Rename collection with documents (create DST and then SRC)");
{
const src = getNewColl();
const dstName = getNewCollName();
src.save({x: 1});
src.save({x: 2});
src.save({x: 3});
assert.eq(3, src.countDocuments({}));
assert.commandWorked(src.renameCollection(dstName));
assert.eq(0, src.countDocuments({}));
const dst = db[dstName];
assert.eq(3, dst.countDocuments({}));
dst.drop();
}
jsTest.log("Rename collection with indexes");
{
const src = getNewColl();
const dstName = getNewCollName();
const existingDst = getNewColl();
src.save({a: 1});
src.save({a: 2});
src.createIndex({a: 1});
src.createIndex({b: 1});
existingDst.save({a: 100});
assert.commandFailed(
db.adminCommand({renameCollection: src.getFullName(), to: existingDst.getFullName()}));
const originalNumberOfIndexes = src.getIndexes().length;
assert.commandWorked(src.renameCollection(dstName));
assert.eq(0, src.countDocuments({}));
const dst = db[dstName];
assert.eq(2, dst.countDocuments({}));
assert(db.getCollectionNames().indexOf(dst.getName()) >= 0);
assert(db.getCollectionNames().indexOf(src.getName()) < 0);
assert.eq(originalNumberOfIndexes, dst.getIndexes().length);
assert.eq(0, src.getIndexes().length);
dst.drop();
}
jsTest.log("Rename collection with existing target");
{
const src = getNewColl();
const dst = getNewColl();
src.save({x: 1});
dst.save({x: 2});
assert.eq(1, src.countDocuments({x: 1}));
assert.eq(1, dst.countDocuments({x: 2}));
assert.commandFailed(src.renameCollection(dst.getName()));
assert.eq(1, src.countDocuments({x: 1}));
assert.eq(1, dst.countDocuments({x: 2}));
assert.commandWorked(src.renameCollection(dst.getName(), true /* dropTarget */));
assert.eq(0, src.countDocuments({x: 2}));
assert.eq(1, dst.countDocuments({}));
dst.drop();
}
})();
|