Mongodb 什么是通过 ID 检索子文档的最佳方法,如果我知道父 ID 和子 ID

Mondodb what is the best way to retrieve a subdocument by Id, If I know parent id and sub id

现在我是这样做的

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);
});

,但不确定这样做是否正确。我的架构是这样的

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

所以我想通过 560b05b6fd9d267f60b7bb28 和 561a22cbe6ebf6d62965b4bc

得到 phone 1234

子文档不能有 _id,至少不能有相同的语义。文档的 _id 总是 索引并且必须是唯一的并且有一些其他含义。您文档的 phones 数组中的 _id 字段是 phone.

的普通字段

所以你可以用通常的方式访问它。在 shell 术语中:

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.