2012-06-04 9 views
13

In meiner Bild-Sharing-Anwendung können Sie Alben erstellen und Bilder zu ihnen hinzufügen. Wenn ein Bild von der Website gelöscht wird, sollte es ebenso aus dem Album entfernt werden, in dem Verweise auf das Bild (Name, ID) gespeichert sind.Finden einer Übereinstimmung in einem Array-Feld

Die Sache, die ich brauche mit Hilfe ist zu finden, welche Alben, die das Bild (Referenz) gespeichert hat, die gerade entfernt wird.

In der Route unten ist, was ich bisher versucht habe, aber ich bekomme einen Fehler bei der Abfrage. Ich habe die MongoDB docs überprüft und die Syntax sieht wie folgt aus:

db.collection.find({ field : { $in : array } }); 

In meiner Route das Feld und das Feld hat Orte geschaltet, die nicht zu funktionieren scheint.

Ich würde wirklich etwas Hilfe schätzen. Danke im Voraus!

Meine Modelle sieht wie folgt aus:

var AlbumSchema = new Schema({ 
     title    : String, 
     imageName   : [String], <-- array the contains of images names 
     imageId   : [String] <-- array the contains of images id's 
}); 

modelObject.AlbumSchema = AlbumSchema; 
modelObject.Album = mongoose.model('Album', AlbumSchema); 

var ImageSchema = new Schema({ 
    name : String, 
    size : Number, 
    type : String 
}); 

modelObject.ImgSchema = ImgSchema; 
modelObject.Image = mongoose.model('Image', ImgSchema); 

Die Route für ein Bild zu löschen:

app.get('/blog/delete/:id', function(req, res){ 

    model.ImagePost.findById(req.params.id, function (err, blog){ 

     var theImage = blog.name; 

     if (err) { 
      console.log(err); 
      // do something 
     } 

     var query = albumModel.Album.find({ imageName: { $in : theImage } }); 

     query.exec(function (err, albums) { 

      if (!albums) { 
       console.log(err); 
       // do something 

       blog.remove(function(err) { 
        console.log(err); 
        // do something 
       }); 

       res.redirect('/blogs'); 
      } 

      else { 
       // code for removing the image(s) in the albums 

       res.redirect('/blogs'); 
      } 
     }); 
    }); 
}); 

Antwort

34

db.collection.find({ field : { $in : array } }); ist nicht die Syntax, die Sie wollen. Das sagt "Finde mir das Dokument, wo dieses Feld einen der Listenwerte hat, die ich dir in einem Array geben werde."

Sie möchten die Gleichheit verwenden, während reaching into the array.

db.collection.find({ imageName:theImage })

Das sagt mir das Dokument finden, wo ist theImage imagename so wird dies das Album zurückkehren (oder Alben, wenn ein Bild in mehr als ein Album sein kann), die das Bild in seiner imagename Array enthält.

+6

Sehr gute Antwort (+1). Dies ist ein weiterer Link, den ich gefunden habe http://docs.mongodb.org/manual/tutorial/query-documents/#match-an-array-element – Tom

+0

Dank Tom ___;) – coiso

+1

Link ist jetzt tot. – Neta

Verwandte Themen