0

现在我正在这样做

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

4

1 回答 1

1

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

因此,您可以按通常的方式访问它。在外壳方面:

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.
于 2015-10-11T10:58:00.490 回答