2016-07-18 29 views
0

ich ähnlich wieMongo Dokumente finden, wo Subdokument mehrere Kriterien entspricht

{ 
"_id" : ObjectId("57832cb74114065710110971"), 
"strName" : "Some Book In Library", 
"strUPN" : "123456", 
"bHardCover": "yes", 
"bIsDamaged" : "yes", 
"arrWhoHasRead" : [ 
    { 
     "nUserID" : ObjectId("577b0b8d41140640f94894a1"), 
     "strPersonName" : "John Doe", 
     "strRole" : "Author" 
    }, 
{ 
     "nUserID" : ObjectId("xyz"), 
     "strPersonName" : "Jane Doe", 
     "strRole" : "Customer" 
    } 
] 
} 

eine Sammlung haben möchte ich alle Datensätze zurückzugeben, haben bIsDamaged = yes, und bHardCover = yes und wo (arrWhoHasRead.nUserID = 577b0b8d41140640f94894a1 UND arrWhoHasRead.strRole = "Autor")

Ich habe versucht, meine multiple AND-Bedingung (die in Paranthesis) in ein Array zu verschachteln, aber das schien nicht viel zu helfen. Vielleicht brauche ich Projektion?

ich dies in PHP bin mit

Antwort

0

Wenn Sie alle Rekord für Ihre Anforderungen einschließlich aller anderen Elemente der arrWhoHasRead angezeigt werden soll, ein find genügt:

db.device.find({"bHardCover": "yes","bIsDamaged" : "yes","arrWhoHasRead.nUserID":ObjectId("577b0b8d41140640f94894a1"),"arrWhoHasRead.strRole":"Author"}); 

, die Sie geben werden:

{ 
    "_id": ObjectId("578d7f9aca19a63da3984899"), 
    "strName": "Some Book In Library", 
    "strUPN": "123456", 
    "bHardCover": "yes", 
    "bIsDamaged": "yes", 
    "arrWhoHasRead": [{ 
     "nUserID": ObjectId("577b0b8d41140640f94894a1"), 
     "strPersonName": "John Doe", 
     "strRole": "Author" 
    }, { 
     "nUserID": ObjectId("578d7d6bca19a63da3984897"), 
     "strPersonName": "Jane Doe", 
     "strRole": "Customer" 
    }] 
} { 
    "_id": ObjectId("578d7fb0ca19a63da398489a"), 
    "strName": "Some Book In Library", 
    "strUPN": "123456", 
    "bHardCover": "yes", 
    "bIsDamaged": "yes", 
    "arrWhoHasRead": [{ 
     "nUserID": ObjectId("577b0b8d41140640f94894a1"), 
     "strPersonName": "John Doe", 
     "strRole": "Author" 
    }, { 
     "nUserID": ObjectId("578d7d6bca19a63da3984898"), 
     "strPersonName": "Jane Doe", 
     "strRole": "Customer" 
    }] 
} 

Wenn Sie Ergebnisse haben wollen, nur die Elemente der arrWhoHasReadObjectId("577b0b8d41140640f94894a1") passend Können Sie ein aggregate aber keine Notwendigkeit für die Projektion tun, wenn Sie ein anderes Feld ausschließen möchten:

db.device.aggregate([{ 
    "$unwind": "$arrWhoHasRead" 
}, { 
    $match: { 
     "bHardCover": "yes", 
     "bIsDamaged": "yes", 
     "arrWhoHasRead.nUserID": ObjectId("577b0b8d41140640f94894a1"), 
     "arrWhoHasRead.strRole": "Author" 
    } 
}]) 

, die geben wird:

{ 
    "_id": ObjectId("578d7f9aca19a63da3984899"), 
    "strName": "Some Book In Library", 
    "strUPN": "123456", 
    "bHardCover": "yes", 
    "bIsDamaged": "yes", 
    "arrWhoHasRead": { 
     "nUserID": ObjectId("577b0b8d41140640f94894a1"), 
     "strPersonName": "John Doe", 
     "strRole": "Author" 
    } 
} { 
    "_id": ObjectId("578d7fb0ca19a63da398489a"), 
    "strName": "Some Book In Library", 
    "strUPN": "123456", 
    "bHardCover": "yes", 
    "bIsDamaged": "yes", 
    "arrWhoHasRead": { 
     "nUserID": ObjectId("577b0b8d41140640f94894a1"), 
     "strPersonName": "John Doe", 
     "strRole": "Author" 
    } 
} 

Beachten Sie, dass das Array entspannen wurde, so dass Sie nur haben JSON-Objekt in arrWhoHasRead & so viel wie Datensatz als ObjectId("577b0b8d41140640f94894a1") in arrWhoHasRead

Verwandte Themen