/ / Mondodb jaki jest najlepszy sposób na odzyskanie dokumentu podrzędnego według Id, jeśli znam identyfikator rodzica i identyfikator podrzędny - mongodb, dokument podrzędny

Mondodb jaki jest najlepszy sposób na pobranie subdokumentu przez Id, Jeśli znam nadrzędny id i sub id - mongodb, subdokument

Teraz tak to robię

Client.findOne({_id: client_id}, function (err, client) {

if(err){ return next() }

var phone = client.phones.filter(function (phone) {
return phone._id === phone_id;
}).pop();

res.status(200).send(phone);
});

, ale nie jestem pewien, czy jest to właściwy sposób. Mój schemat jest taki

{
"_id" : ObjectId("560b05b6fd9d267f60b7bb28"),
"email" : "email@email.com",
"__v" : 1,
"phones" : [
{
"_id" : ObjectId("561a22cbe6ebf6d62965b4bc"),
"phone" : "1234"
}
]
}

Więc chciałbym dostać telefon 1234 przez 560b05b6fd9d267f60b7bb28 i 561a22cbe6ebf6d62965b4bc

Odpowiedzi:

1 dla odpowiedzi № 1

Poddokument nie może mieć _id, przynajmniej nie z tą samą semantyką. Dokument _id jest zawsze zindeksowany i musi być unikalny oraz mieć inne implikacje. The _id pole w phones tablica dokumentów to normalne pole jak phone.

Możesz więc uzyskać do niego dostęp w zwykły sposób. W skrócie:

var doc = db.phones.findOne(
// query part
{
"_id": knownIdOfDocument,
"phones": $elemMatch:{"_id": knownIdOfSubdocument}
},
// projection
{ "phones.$":1 }
)
var phone = doc["phones"][0]; // Iirc, my JS is a bit rusty.