Mangouste Requête: Trouver un élément dans un tableau
Mangouste/Mongo noob ici:
Mes Données
Voici mon simplifiée des données, chaque utilisateur possède son propre document
{ "__v" : 1,
"_id" : ObjectId( "53440e94c02b3cae81eb0065" ),
"email" : "[email protected]",
"firstName" : "testFirstName",
"inventories" : [
{ "_id" : "active",
"tags" : [
"inventory",
"active",
"vehicles" ],
"title" : "activeInventory",
"vehicles" : [
{ "_id" : ObjectId( "53440e94c02b3cae81eb0069" ),
"tags" : [
"vehicle" ],
"details" : [
{ "_id" : ObjectId( "53440e94c02b3cae81eb0066" ),
"year" : 2007,
"transmission" : "Manual",
"price" : 1000,
"model" : "Firecar",
"mileageReading" : 50000,
"make" : "Bentley",
"interiorColor" : "blue",
"history" : "CarProof",
"exteriorColor" : "blue",
"driveTrain" : "SWD",
"description" : "test vehicle",
"cylinders" : 4,
"mileageType" : "kms" } ] } ] },
{ "title" : "soldInventory",
"_id" : "sold",
"vehicles" : [],
"tags" : [
"inventory",
"sold",
"vehicles" ] },
{ "title" : "deletedInventory",
"_id" : "deleted",
"vehicles" : [],
"tags" : [
"inventory",
"sold",
"vehicles" ] } ] }
Comme vous pouvez le voir, chaque utilisateur dispose d'un inventories
propriété qui est un tableau qui contient 3 stocks (activeInventory, soldInventory et deletedInventory)
Ma Requête
Donné un email de l'utilisateur d'un véhicule ID, je voudrais que ma requête à aller par le biais de recherche de l'utilisateur activeInventory
et de renvoyer simplement le véhicule qui correspond à l'ID. Voici ce que j'ai à ce jour:
user = api.mongodb.userModel;
ObjectId = require('mongoose').Types.ObjectId;
return user
.findOne({email : params.username})
.select('inventories')
.find({'title': 'activeInventory'})
//also tried
//.where('title')
//.equals('activeInventory')
.exec(function(err, result){
console.log(err);
console.log(result);
});
Avec cette, résultat sort comme un tableau vide. J'ai aussi essayé de .find('inventories.title': 'activeInventory')
qui étrangement retourne l'ensemble des stocks de tableau. Si possible, j'aimerais garder le chaînage format de la requête que je trouve ça beaucoup plus lisible.
Mon Idéal Requête
return user
.findOne({email : params.username})
.select('inventories')
.where('title')
.equals('activeInventory')
.select('vehicles')
.id(vehicleID)
.exec(cb)
Évidemment ça ne fonctionne pas, mais il peut vous donner une idée de ce que je suis en train de faire.
OriginalL'auteur NicolasMoise | 2014-04-08
Vous devez vous connecter pour publier un commentaire.
À l'aide de la
$
opérateur de position, vous pouvez obtenir les résultats. Toutefois, si vous avez plusieurs éléments dans levehicles
de la matrice de tous d'entre eux seront retournés dans le résultat, comme vous pouvez uniquement utiliser un opérateur de position dans la projection et que vous travaillez avec 2 tableaux, l'un dans l'autre).Je vous conseille de prendre un coup d'oeil à la
agrégation de cadre
, comme vous aurez beaucoup plus de flexibilité. Voici un exemple de requête pour votre question qui s'exécute dans l'environnement. Je ne suis pas familier avec la mangouste, mais je suppose que cela va encore vous aider et vous seriez en mesure de le traduire:Voici le résultat que vous obtiendrez:
OriginalL'auteur Anand Jayabalan
obtenir le chaînage format de la requête ... je ne sais pas comment l'analyser, mais, ce que vous recherchez est la projection, vous devriez jeter un oeil à http://docs.mongodb.org/manual/reference/operator/projection/
il serait probablement ressembler à ceci :
OriginalL'auteur Ostro