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 № 1Poddokument 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.