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

时间:2015-10-11 10:37:36

标签: mongodb subdocument

现在我这样做

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获得电话1234

1 个答案:

答案 0 :(得分:1)

子文档不能有_id,至少没有相同的语义。文档的_id 始终已编入索引,并且必须是唯一的并且具有其他一些含义。您文档的_id数组中的phones字段是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.