Ich habe ein MongoDB-Dokument mit Datensätzen, die folgendermaßen aussehen:

[
  { _id: id, category_name: 'category1', parent_category: null },
  { _id: id, category_name: 'category2', parent_category: null },
  { _id: id, category_name: 'subcategory1', parent_category: id_parent_1 },
  { _id: id, category_name: 'subcategory2', parent_category: id_parent_1 },
  { _id: id, category_name: 'subcategory3', parent_category: id_parent_2 },
  { _id: id, category_name: 'subcategory4', parent_category: id_parent_2 }
]

Wie Sie sehen können, speichere ich Kategorien mit einem parent_category von null, und Unterkategorien haben die ID der übergeordneten Kategorie. Was ich suche, ist, diese in ein Format wie dieses zu gruppieren:

[
  { category_name: 'category1', categories: [
       { category_name: 'subcategory1', _id: id },
       { category_name: 'subcategory2', _id: id }
    ]
  },
  { category_name: 'category2', categories: [
       { category_name: 'subcategory3', _id: id },
       { category_name: 'subcategory4', _id: id }
    ]
  }
]

Gruppieren Sie also im Grunde die übergeordneten Kategorien mit einem Array mit ihren untergeordneten Kategorien. Ich benutze Mungo. Ich habe versucht, das von MongoDB bereitgestellte Aggregationsframework zu verwenden, kann jedoch nicht das gewünschte Ergebnis erzielen. :(

Ich habe Zugriff darauf, das Schema in einer Weise zu ändern, die erforderlich sein könnte!

Danke im Voraus!

1
pmerino 23 Aug. 2015 im 13:11

3 Antworten

Beste Antwort

Es scheint, als würden Sie Mongo wie eine relationale Datenbank behandeln (alle diese Felder trennen und mit einer Abfrage zusammenführen). Sie sollten Ihr Schema neu erstellen. Beispielsweise:

var CategorySchema = new Schema({
   category_name: String,
   subCategories:[subCategorySchema]
}

var subCategorySchema = new Schema({
   category_name: String
})

Auf diese Weise ist es einfach, wenn Sie die Sammlung abfragen müssen

db.find({category_name: "name of the category"}, function(){})

Um alles zu bekommen, was du brauchst.

Nur für den Fall: Sie können die Unterkategorien mit einfachen Updates zum Array hinzufügen. Weitere Informationen finden Sie unter .

3
jackfrster 25 Aug. 2015 im 20:32

Bitte versuchen Sie dies, wenn Ihr Schema nicht geändert wird:

var MongoClient = require('mongodb').MongoClient

//connect away
MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
  if (err) throw err;
  console.log("Connected to Database");

  //simple json record
    var document = [];
    //insert record
    //db.data.find({"parent_category":null }).forEach(function(data) {print("user: " + db.data.findOne({"parent_category":data._id })) })
    db.collection('data').find({"parent_category":null }, function(err, parentrecords) {
        if (err) throw err;
        var cat ={};
        parentrecords.forEach(function(data){
            cat["category_name"] = data["category_name"];
            db.collection('data').find({"parent_category":data._id },function(err, childrecords) {
                var doc = [];
                childrecords.forEach(function(childdata){
                    doc.push(childdata);
                        },function(){
                        cat["categories"] = doc;
                        document.push(cat);
                        console.log(document);
                    });
            });
        });
});
});
1
nitesh singh 26 Aug. 2015 im 02:19

Um Datensätze nach einem Feld zu gruppieren, verwenden Sie $ group in Aggreegation . Dies hat bei mir funktioniert.

Beispiel

db.categories.aggregate(
   [
     { $group : { _id : {category_name:"$category_name"}, categories: { $push: {category_name:"$category_name",_id:"$_id"} } } }
   ]
)

Referenz : MongoDB-Aggregation

Hoffe das funktioniert.

-1
SUNDARRAJAN K 26 Aug. 2015 im 05:50