MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

mongoDB:Criando um ObjectId para cada novo filho adicionado ao campo Array


Não é um mongodb expert mas, se entendi corretamente, você deseja que o campo _id do subdocumento seja inserido automaticamente.

Eu criei threads db e, em seguida, inseriu a primeira message nas messages coleção usando o seguinte comando:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]}); 

Observe o _id:ObjectId() campo. O resultado é o seguinte:



Agora que tenho um ObjectId(56...) , posso atualizar esse registro específico e inserir mais mensagens nele. E o comando é o seguinte:
db.messages.update({"_id":ObjectId("56...")}, 
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});

E o acima inseriria a nova mensagem na coleção. Veja abaixo as capturas de tela:



e, finalmente, após algumas atualizações, a coleção fica assim:



Todos os campos _id nas messages array são gerados automaticamente.

Pode não ser uma boa ideia usar _id campos por vários motivos. Consulte o Google para obter mais detalhes sobre usar ou não _id como chave para subdocumentos.

Eu usei o MongoDB shell versão 3.0.6 para os comandos.

EDITAR 28-01-2016 16:09

Como a solução acima foi baseada no shell do MongoDB, decidi fazer outro teste usando o driver Node.js para o MongoDB. Primeiro de tudo, eu declaro a variável ObjectID da seguinte forma
var ObjectID = require('mongodb').ObjectID;

Usarei o ObjectID com id do documento do thread no qual a mensagem deve ser inserida conforme segue no meu update e findOneAndUpdate chamadas de função
app.get('/insertNewMessage', function(req, res) {
    db.collection("messages").findOneAndUpdate({
        _id: new ObjectID('56aa3554e90911b64c36a424')
    }, {
        $push: {
            messages: {
                _id: new ObjectID(),
                message: "From NodeJS with <3 using findOneAndUpdate.Bye."
            }
        }
    }, function(err, result) {
        if (err)
            res.json(err);
        else
            res.json(result);
    });
});

Testei os dois e funciona perfeitamente. Veja a imagem abaixo: