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 に答える