Skip to content

Latest commit

 

History

History
902 lines (879 loc) · 23.5 KB

project-felipelopesrita-felipe-jose-lopes-rita.md

File metadata and controls

902 lines (879 loc) · 23.5 KB

MongoDb - Projeto Final

Autor: Felipe José Lopes Rita Data 1456776496894

Para qual sistema você usaria o MogoDB (diferente desse)?

Antigamente não cogitava a utilização de bancos NoSQL, por não conhecer e julgar que a curva de aprendizado seria lenta e não produtiva. Agora que conheço, posso dizer que fiquei fascinado com a simplicidade e praticidade que o banco proporciona. Sendo assim, eu usaria MongoDB em quase todas as minhas aplicações web, devido as suas vantagens que apontei antes. Obviamente, talvez fossem necessários outros bancos para casos mais específicos (grafos e tudo mais), mas então eu poderia utilizá-los em conjunto com o mongo, tendo uma aplicação com múltiplos bancos de dados, como o Suissa comentou que existiam, na primeira aula de mongo.

Qual a modelagem da sua coleção de users?

{
	name: String,
    bio: String,
    date_register: Date,
    avatar_path: String,
    background_path: String,
    auth: {
    	username: String,
        email: String,
        password: String,
        last_access: Date,
        status: String, //online, offline, disable, etc
        hash_token: String
    }
}

Qual a modelagem da sua coleção de projects?

{
	name: String,
    description: String,
    date_begin: Date,
    date_dream: Date,
    date_end: Date,
    visible: Boolean,
    realocate: Boolean,
    expired: Boolean
    visualizable_mod: Boolean,
    tags: [],
    members: [{
    	user_id: String,
        type_member: String,
        notify: String
    }]
    goals: [{
    	name: String,
        description: String,
        date_begin: Date,
        date_dream: Date,
        date_end: Date,
        realocate: Boolean,
        date_realocate: Date,
        expired: Boolean,
        tags: [],
        "activities" : [{
                "activity_id" : String
        }]
    }]
}

Qual a modelagem da sua coleção retirada de projects?

activity: {
	name: String,
    description: String,
    date_begin: Date,
    date_dream: Date,
    date_end: Date,
    realocate: Boolean,
    date_realocate: Date,
    expired: Boolean,
    tags: [],
    members: [{
    	user_id: String,
        notify: String
    }],
    comments: [{
    	user_id: String, //member
    	text: String,
        date_comment: Date,
        files: [{
        	path: String,
            weight: String,
            name: String
        }]
    }]
}

Retirei essa coleção de projects. O principal é que tendo em mente o tipo de busca realizada pelo sistema, as atividades não seriam buscadas em conjunto. Isso é, tendo em mente que a busca do usuário seria algo por projects e goals, faz sentido manter estes campos na mesma coleção, para que toda informação seja trazida de uma vez na busca. Porém, atividades provavelmente serão buscadas apenas após você ter informações sobre os projects e goals, então ela poderia ficar numa coleção separada.

Create - cadastro

#####1. Cadastre 10 usuários diferentes

var users = [];
var usernames = [ "Felipe", "Jorge", "Lucas", "Matheus", "Robson", "Adiana", "Bianca", "Luciana", "Bruna", "Heloise" ]

for( var i=0; i< 10; i++ ) {

	var name = usernames[i].toLowerCase();
	var x = {
    	name: usernames[i],
        bio: null,
        date_register: "2016-02-17",
        avatar_path: null,
        background_path: null,
        auth: {
            username: name,
            email: name+"@gmail.com",
            password: "qwe123",
            last_access: "2016-02-17",
            status: "offline", //online, offline, disable, etc
        }
    }
	users.push(x);
}
StarKiller(mongod-3.2.0) be-mean-projeto> db.users.insert(users)
Inserted 1 record(s) in 201ms
BulkWriteResult({
  "writeErrors": [ ],
  "writeConcernErrors": [ ],
  "nInserted": 10,
  "nUpserted": 0,
  "nMatched": 0,
  "nModified": 0,
  "nRemoved": 0,
  "upserted": [ ]
})

#####2. Cadastre 5 projetos diferentes

/* Ids dos usuarios */
var resul = db.users.find({}, {_id:1})
var ids = [];
for(var i=0; i< 10;i++) { ids.push(resul[i]._id); }

/* Cadastrando as activities */
var activities = [
        {name: 'MEAN - MongoDB'},
        {name: 'MEAN - Express'},
        {name: 'MEAN - Angular'},
        {name: 'MEAN - NodeJS'},
        {name: 'PHP - MongoDB'},
        {name: 'PHP - Frameworks'},
        {name: 'Frontend - HTML5&CSS3'},
        {name: 'Editores de texto - Sublime Text'}
];
db.activity.insert(activities)
var resul = db.activity.find({}, {_id:1})
var idsActiv = [];
for(var i=0; i< activities.length;i++) { idsActiv.push(resul[i]._id); }

/* Jsons com os documentos a serem inseridos (projects) */
var insert = [
	{
        name: "MongoDB",
        description: "Projeto de estudo do MongoDB ",
        tags: [ 'noSQL', 'Be MEAN', 'Projeto final' ],
        members: [
        	{ user_id: ids[0], type_member: "normal", notify: null },
        	{ user_id: ids[1], type_member: "normal", notify: null },
        	{ user_id: ids[2], type_member: "normal", notify: null },
        	{ user_id: ids[3], type_member: "normal", notify: null },
        	{ user_id: ids[4], type_member: "normal", notify: null }
		],
        goals: [
        	{
            	name:"Aprendizado",
            	description: "Aprender na prática sobre bancos NoSQL",
                tags:['Aprendizado', 'Webschool', 'Youtube'],
                activities: [ idsActiv[0], idsActiv[1] ]
            }
        ]
    },
    {
        name: "Express",
        description: "Projeto de estudo do Express ",
        tags: [ 'Framework', 'Be MEAN', 'Javascript' ],
        members: [
        	{ user_id: ids[5], type_member: "normal", notify: null },
        	{ user_id: ids[6], type_member: "normal", notify: null },
        	{ user_id: ids[7], type_member: "normal", notify: null },
        	{ user_id: ids[8], type_member: "normal", notify: null },
        	{ user_id: ids[9], type_member: "normal", notify: null }
		],
        goals: [
        	{
            	name:"Aprendizado",
            	description: "Aprender na prática sobre Express",
                tags:['Aprendizado', 'Webschool', 'Youtube'],
                activities: [ idsActiv[2], idsActiv[3] ]
            }
        ]
    },
    {
        name: "Angular",
        description: "Projeto de estudo do Angular ",
        tags: [ 'angularJs', 'Be MEAN', 'CodeForLive' ],
        members: [
        	{ user_id: ids[0], type_member: "normal", notify: null },
        	{ user_id: ids[5], type_member: "normal", notify: null },
        	{ user_id: ids[1], type_member: "normal", notify: null },
        	{ user_id: ids[6], type_member: "normal", notify: null },
        	{ user_id: ids[2], type_member: "normal", notify: null }
		],
        goals: [
        	{
            	name:"Aprendizado",
            	description: "Aprender na prática sobre AngularJS",
                tags:['Aprendizado', 'Webschool', 'Youtube'],
                activities: [ idsActiv[4], idsActiv[5] ]
            }
        ]
    },
    {
        name: "NodeJS",
        description: "Projeto de estudo do NodeJS ",
        tags: [ 'JSnoComando', 'Server', 'CodeForLive' ],
        members: [
        	{ user_id: ids[0], type_member: "normal", notify: null },
        	{ user_id: ids[6], type_member: "normal", notify: null },
        	{ user_id: ids[2], type_member: "normal", notify: null },
        	{ user_id: ids[9], type_member: "normal", notify: null },
        	{ user_id: ids[4], type_member: "normal", notify: null }
		],
        goals: [
        	{
            	name:"Aprendizado",
            	description: "Aprender na prática sobre bancos NoSQL",
                tags:['Aprendizado', 'Webschool', 'Youtube'],
                activities: [ idsActiv[6], idsActiv[7] ]
            }
        ]
    },
    {
        name: "PHP",
        description: "Projeto de estudo do PHP ",
        tags: [ 'PHPé-de-pano', 'PHPica', 'PHPinga' ],
        members: [
        	{ user_id: ids[9], type_member: "normal", notify: null },
        	{ user_id: ids[1], type_member: "normal", notify: null },
        	{ user_id: ids[3], type_member: "normal", notify: null },
        	{ user_id: ids[7], type_member: "normal", notify: null },
        	{ user_id: ids[5], type_member: "normal", notify: null }
		],
        goals: [
        	{
            	name:"Aprendizado",
            	description: "Aprender na prática sobre PHP",
                tags:['Aprendizado', 'Webschool', 'Youtube'],
                activities: []
            }
        ]
    }
]

/* Insere os projects */
StarKiller(mongod-3.2.0) be-mean-projeto> db.project.insert(insert)
Inserted 1 record(s) in 27ms
BulkWriteResult({
  "writeErrors": [ ],
  "writeConcernErrors": [ ],
  "nInserted": 5,
  "nUpserted": 0,
  "nMatched": 0,
  "nModified": 0,
  "nRemoved": 0,
  "upserted": [ ]
})

Retrieve - busca

#####1. Liste as informações dos membros de 1 projeto específico que deve ser buscado pelo seu nome de forma a não ligar para maiúsculas e minúsculas

function getInfoUsers( arr ){
	var info = [];
    arr.forEach(function(user){
    	info.push(db.users.findOne({_id: user.user_id}));
    });
    return info;
}
var query = { name: /express/i }
var members = getInfoUsers(db.project.findOne(query).members)
StarKiller(mongod-3.2.0) be-mean-projeto> members
[
  {
    "_id": ObjectId("56c47f5b5586eacfc2e6054a"),
    "name": "Adiana",
    "bio": null,
    "date_register": "2016-02-17",
    "avatar_path": null,
    "background_path": null,
    "auth": {
      "username": "adiana",
      "email": "adiana@gmail.com",
      "password": "qwe123",
      "last_access": "2016-02-17",
      "status": "offline"
    }
  },
  {
    "_id": ObjectId("56c47f5b5586eacfc2e6054b"),
    "name": "Bianca",
    "bio": null,
    "date_register": "2016-02-17",
    "avatar_path": null,
    "background_path": null,
    "auth": {
      "username": "bianca",
      "email": "bianca@gmail.com",
      "password": "qwe123",
      "last_access": "2016-02-17",
      "status": "offline"
    }
  },
  {
    "_id": ObjectId("56c47f5b5586eacfc2e6054c"),
    "name": "Luciana",
    "bio": null,
    "date_register": "2016-02-17",
    "avatar_path": null,
    "background_path": null,
    "auth": {
      "username": "luciana",
      "email": "luciana@gmail.com",
      "password": "qwe123",
      "last_access": "2016-02-17",
      "status": "offline"
    }
  },
  {
    "_id": ObjectId("56c47f5b5586eacfc2e6054d"),
    "name": "Bruna",
    "bio": null,
    "date_register": "2016-02-17",
    "avatar_path": null,
    "background_path": null,
    "auth": {
      "username": "bruna",
      "email": "bruna@gmail.com",
      "password": "qwe123",
      "last_access": "2016-02-17",
      "status": "offline"
    }
  },
  {
    "_id": ObjectId("56c47f5b5586eacfc2e6054e"),
    "name": "Heloise",
    "bio": null,
    "date_register": "2016-02-17",
    "avatar_path": null,
    "background_path": null,
    "auth": {
      "username": "heloise",
      "email": "heloise@gmail.com",
      "password": "qwe123",
      "last_access": "2016-02-17",
      "status": "offline"
    }
  }
]

#####Liste todos os projetos com a tag que você escolheu para os 3 projetos em comum

var query = { tags: { $in: [/Be Mean/i] } }
StarKiller(mongod-3.2.0) be-mean-projeto> db.project.find(query)
{
  "_id": ObjectId("56c49ad25ca97b410b38fbfc"),
  "name": "MongoDB",
  "description": "Projeto de estudo do MongoDB ",
  "tags": [
    "noSQL",
    "Be MEAN",
    "Projeto final"
  ],
  "members": [
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60545"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60546"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60547"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60548"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60549"),
      "type_member": "normal",
      "notify": null
    }
  ],
  "goals": [
    {
      "name": "Aprendizado",
      "description": "Aprender na prática sobre bancos NoSQL",
      "tags": [
        "Aprendizado",
        "Webschool",
        "Youtube"
      ],
      "activities": [
        ObjectId("56c49aaa5ca97b410b38fbf4"),
        ObjectId("56c49aaa5ca97b410b38fbf5")
      ]
    }
  ]
}
{
  "_id": ObjectId("56c49ad25ca97b410b38fbfd"),
  "name": "Express",
  "description": "Projeto de estudo do Express ",
  "tags": [
    "Framework",
    "Be MEAN",
    "Javascript"
  ],
  "members": [
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e6054a"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e6054b"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e6054c"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e6054d"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e6054e"),
      "type_member": "normal",
      "notify": null
    }
  ],
  "goals": [
    {
      "name": "Aprendizado",
      "description": "Aprender na prática sobre Express",
      "tags": [
        "Aprendizado",
        "Webschool",
        "Youtube"
      ],
      "activities": [
        ObjectId("56c49aaa5ca97b410b38fbf6"),
        ObjectId("56c49aaa5ca97b410b38fbf7")
      ]
    }
  ]
}
{
  "_id": ObjectId("56c49ad25ca97b410b38fbfe"),
  "name": "Angular",
  "description": "Projeto de estudo do Angular ",
  "tags": [
    "angularJs",
    "Be MEAN",
    "CodeForLive"
  ],
  "members": [
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60545"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e6054a"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60546"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e6054b"),
      "type_member": "normal",
      "notify": null
    },
    {
      "user_id": ObjectId("56c47f5b5586eacfc2e60547"),
      "type_member": "normal",
      "notify": null
    }
  ],
  "goals": [
    {
      "name": "Aprendizado",
      "description": "Aprender na prática sobre AngularJS",
      "tags": [
        "Aprendizado",
        "Webschool",
        "Youtube"
      ],
      "activities": [
        ObjectId("56c49aaa5ca97b410b38fbf8"),
        ObjectId("56c49aaa5ca97b410b38fbf9")
      ]
    }
  ]
}
Fetched 3 record(s) in 4ms

#####Liste apenas os nomes de todas as atividades para todos os projetos

function getNameActivity( obj ) { return db.activity.findOne( {_id: obj}, {name:1, _id:0} ) }
var resul = db.project.find({})
var cont = db.project.count()
var namesActivities = []
for( var i=0; i< cont;i++ ) {
	resul[i].goals.forEach(function(goal){
    	goal.activities.forEach(function(idEl){
            namesActivities.push( getNameActivity(idEl) );
        });
    });
}
StarKiller(mongod-3.2.0) be-mean-projeto> namesActivities
[
  {
    "name": "MEAN - MongoDB"
  },
  {
    "name": "MEAN - Express"
  },
  {
    "name": "MEAN - Angular"
  },
  {
    "name": "MEAN - NodeJS"
  },
  {
    "name": "PHP - MongoDB"
  },
  {
    "name": "PHP - Frameworks"
  },
  {
    "name": "Frontend - HTML5&CSS3"
  },
  {
    "name": "Editores de texto - Sublime Text"
  }
]

#####Liste todos os projetos que não possuam uma tag

var query = { tags: { $not: {$in:[/'Be MEAN/i]} } }
StarKiller(mongod-3.2.0) be-mean-projeto> db.project.find(query, {name:1})
{
  "_id": ObjectId("56c49ad25ca97b410b38fbfc"),
  "name": "MongoDB"
}
{
  "_id": ObjectId("56c49ad25ca97b410b38fbfd"),
  "name": "Express"
}
{
  "_id": ObjectId("56c49ad25ca97b410b38fbfe"),
  "name": "Angular"
}
{
  "_id": ObjectId("56c49ad25ca97b410b38fbff"),
  "name": "NodeJS"
}
{
  "_id": ObjectId("56c49ad25ca97b410b38fc00"),
  "name": "PHP"
}
Fetched 5 record(s) in 14ms

#####Liste todos os usuários que não fazem parte do primeiro projeto cadastrado

var query = { _id: ObjectId("56c49ad25ca97b410b38fbfc") }
var members = [];
db.project.findOne(query).members.forEach(function(ObjId){
	members.push(ObjId.user_id)
})
db.users.find({ _id: { $not: { $in: members } } }, {name:1})

Update - alteração

#####1. Adicione para todos os projetos o campo views: 0

var mod = { $set: { views: 0 } }
var opt = { multi: true }
db.project.update({}, mod, opt)
Updated 5 existing record(s) in 186ms
WriteResult({
  "nMatched": 5,
  "nUpserted": 0,
  "nModified": 5
})

#####2. Adicione 1 tag diferente para cada projeto

var idProj = db.project.find({}, {_id: 1})
var cont = db.project.count()
for(var i=0; i< cont; i++) {
	var query = { _id: idProj[i]._id }
	var mod = { $push: { tags: 'Tag '+(i+1) } }
    db.project.update(query, mod)
}
Updated 1 existing record(s) in 41ms
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 0ms
WriteResult({
  "nMatched": 1,
  "nUpserted": 0,
  "nModified": 1
})

#####3. Adicione 2 membros diferentes para cada projeto

/* Ids dos usuarios */
var resul = db.users.find({}, {_id:1})
var ids = [];
for(var i=0; i< 10;i++) { ids.push(resul[i]._id); }

var idProj = db.project.find({}, {_id: 1})
var cont = db.project.count()

var modUsers = []
for(var i=0; i< 10; i++) {
	modUsers.push([ {user_id: ids[i]}, {user_id: ids[i+1]} ]);
}
for(var i=0; i< cont; i++) {
	var query = { _id: idProj[i]._id }
	var mod = { $pushAll: { members: modUsers[i] } }
    db.project.update(query, mod)
}
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 2ms
Updated 1 existing record(s) in 2ms
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 1ms
WriteResult({
  "nMatched": 1,
  "nUpserted": 0,
  "nModified": 1
})

#####4. Adicione 1 comentário em cada atividade, deixe apenas 1 projeto sem

/* Ids dos usuarios */
var resul = db.users.find({}, {_id:1})
var ids = [];
for(var i=0; i< 10;i++) { ids.push(resul[i]._id); }

var idAct = db.activity.find({}, {_id: 1})
var cont = db.activity.count()
for(var i=0; i< cont-1; i++) {
	var query = { _id: idAct[i]._id }
	var mod = { $push: { comments: { user_id:ids[i], text: 'Comentário número '+(i+1) } } }
    db.activity.update(query, mod)
}
Updated 1 existing record(s) in 2ms
Updated 1 existing record(s) in 0ms
Updated 1 existing record(s) in 0ms
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 1ms
Updated 1 existing record(s) in 1ms
WriteResult({
  "nMatched": 1,
  "nUpserted": 0,
  "nModified": 1
})

#####5. Adicione 1 projeto inteiro com UPSERT

var query = {name: "Bootstrap+CSS3"}
var opt = {upsert: true}
mod = {
	$setOnInsert:{
        name: "Bootstrap+CSS3",
        description: "Projeto de estudo Frontend ",
        members: [
        	{ user_id: ObjectId("56c47f5b5586eacfc2e60545"), type_member: "normal", notify: null },
        	{ user_id: ObjectId("56c47f5b5586eacfc2e6054e"), type_member: "normal", notify: null },
		],
        goals: [
        	{
            	name:"Aprendizado",
            	description: "Aprender na prática sobre bancos FrontEnd",
                tags:['Aprendizado', 'Webschool', 'Youtube']
            }
        ]
    }
}
db.project.update(query, mod, opt)
Updated 1 new record(s) in 24ms
WriteResult({
  "nMatched": 0,
  "nUpserted": 1,
  "nModified": 0,
  "_id": ObjectId("56c4ec11c01f2ab6fced0f9e")
})

Delete - remoção

#####1. Apague todos os projetos que não possuam tags

db.project.remove({ tags : { $exists : 0 } })
Removed 1 record(s) in 3ms
WriteResult({
  "nRemoved": 1
})

#####2. Apague todos os projetos que não possuam comentários nas atividades

function removeProjct(objId){
  db.projects.remove({"goals.activities.activity_id":  objId._id});
}
db.activity.find({'comments.0': {$exists: false}}).forEach(removeProjct)

#####3. Apague todos os projetos que não possuam atividades

var query = { 'goals.activities': [ ] }
db.project.remove(query)
Removed 1 record(s) in 34ms
WriteResult({
  "nRemoved": 1
})

#####4. Escolha 2 usuário e apague todos os projetos em que os 2 fazem parte

var users = [
	{"_id": ObjectId("56c47f5b5586eacfc2e60545")},
	{"_id": ObjectId("56c47f5b5586eacfc2e60546")}
]
users.forEach(function(x){ db.project.remove({'members.user_id': x._id}) })
Removed 3 record(s) in 2ms
Removed 1 record(s) in 2ms

#####5. Apague todos os projetos que possuam uma determinada tag em goal

var query = { 'goals.tags': 'Youtube' }
db.project.remove(query)

Gerenciamento de usuários

#####1. Crie um usuário com permissões APENAS de Leitura

db.createUser(
    {
      user: "usuario-leitura",
      pwd: "12345678",
      roles: [ "read" ]
    }
)

#####2. Crie um usuário com permissões de Escrita e Leitura

db.createUser(
    {
      user: "usuario-leitura-escrita",
      pwd: "12345678",
      roles: [ "readWrite" ]
    }
)

#####3. Adicionar o papel grantRolesToUser e revokeRole para o usuário com Escrita e Leitura

db.runCommand({ createRole: "grantRolesToUser",
	privileges: [
		{ resource: { db: "admin", collection: "" }, actions: [ "grantRole" ] },
	],
	roles: [ "readWrite" ]
})
db.runCommand({ createRole: "revokeRole",
	privileges: [
		{ resource: { db: "admin", collection: "" }, actions: [ "revokeRole" ] },
	],
	roles: [ "readWrite" ]
})
db.grantRolesToUser(
  "usuario-leitura-escrita",
  [ "grantRolesToUser", "revokeRole" ]
)

#####4. Remover o papel grantRolesToUser para o usuário com Escrita e Leitura

db.revokeRolesFromUser(
    "usuario-leitura-escrita",
    [ "grantRolesToUser" ]
)

#####5. Listar todos os usuários com seus papéis e ações

{
  "_id": "admin.usuario-leitura",
  "user": "usuario-leitura",
  "db": "admin",
  "credentials": {
    "SCRAM-SHA-1": {
      "iterationCount": 10000,
      "salt": "RfzpnUnGEvov5XNiTpmH0g==",
      "storedKey": "3oNzKPeJsMvSTRI9Vk055NhpWjY=",
      "serverKey": "TtiMIpe3yuQelqKONVEVh+fu1IE="
    }
  },
  "roles": [
    {
      "role": "read",
      "db": "admin"
    }
  ]
}
{
  "_id": "admin.usuario-leitura-escrita",
  "user": "usuario-leitura-escrita",
  "db": "admin",
  "credentials": {
    "SCRAM-SHA-1": {
      "iterationCount": 10000,
      "salt": "Y39UW7bjohUK1CSIeTlqsQ==",
      "storedKey": "43QIPScQi2G49NuLGk9ibfhiClc=",
      "serverKey": "OEDfwT4r58z5NWAEAmlC1XMMCqQ="
    }
  },
  "roles": [
    {
      "role": "revokeRole",
      "db": "admin"
    },
    {
      "role": "readWrite",
      "db": "admin"
    }
  ]
}
Fetched 2 record(s) in 4ms

Sharding

mkdir /data/configdb
mongod --configsvr --port 27010
mongos --configdb localhost:27010 --port 27011
mongod --port 27012 --dbpath /data/shard1
mongod --port 27013 --dbpath /data/shard2
mongod --port 27014 --dbpath /data/shard3
mongo --port 27011 --host localhost
mongos> sh.addShard("localhost:27012")
mongos> sh.addShard("localhost:27013")
mongos> sh.addShard("localhost:27014")
mongos> sh.enableSharding("be-mean-projeto")
mongos> sh.shardCollection("be-mean-projeto.project", {"_id" : 1})
mongos> sh.shardCollection("be-mean-projeto.users", {"_id" : 1})
mongos> sh.shardCollection("be-mean-projeto.activity", {"_id" : 1})

Replica

mkdir /data/rs1
mkdir /data/rs2
mkdir /data/rs3
mongod --replSet replica_set --port 27017 --dbpath /data/rs1
mongod --replSet replica_set --port 27018 --dbpath /data/rs2
mongod --replSet replica_set --port 27019 --dbpath /data/rs3
mongo --port 27017
mongo> rsconf =
{
  "_id": "replica_set",
  "members": [
    {
      "_id": 0,
      "host": "127.0.0.1:27017"
    }
  ]
}
rs.initiate(rsconf)
rs.add("127.0.0.1:27018")
rs.add("127.0.0.1:27019")