如何按照Mongoose中的字段对logging进行分组?

我有一个MongoDB文件,其logging如下所示:

[ { _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 } ] 

正如你所看到的,我正在存储一个parent_categorynull类别,并且子类别具有父类别的ID。 我正在寻找的是把这些分成几种格式:

 [ { 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 } ] } ] 

所以基本上分组父类别与他们的子类别的数组。 我正在使用mongoose。 我尝试使用MongoDB提供的聚合框架,但我不能得到所需的结果。 🙁

我有权修改架构以任何可能需要的方式!

提前致谢!

看起来你像对待关系数据库一样对待Mongo(将所有这些字段分开,并将它们与查询结合在一起)。 你应该做的是重build你的模式。 例如:

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

这种方式当你需要查询集合这是一个简单的

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

得到你需要的一切。

以防万一:您可以通过简单的更新将子类别添加到数组中。 阅读更多信息。

如果你的模式没有改变,请尝试这个:

 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); }); }); }); }); }); 

如果你想find预期的结果而不改变模式,那么你基本上遵循一些复杂的蒙戈aggregation查询。 为了查找输出,我遵循以下步骤:

  1. 首先在$project检查parent_category是否为true,然后添加_id else add parent_category
  2. 现在,文档结构看起来像新的key name as parent_id呈现和由parent_id分组,并推送其余的数据,如category_name and parent_category
  3. 之后,使用$ setDifference$ setIntersection来区分父数据和子数据。
  4. 而在最后只unwind单个数组对象,所以这个单个数组对象和使用的项目只显示那些显示的字段。

检查工作聚合查询如下:

 db.collectionName.aggregate({ "$project": { "parent_id": { "$cond": { "if": { "$eq": ["$parent_category", null] }, "then": "$_id", "else": "$parent_category" } }, "category_name": 1, "parent_category": 1 } }, { "$group": { "_id": "$parent_id", "categories": { "$push": { "category_name": "$category_name", "parent_category": "$parent_category" } }, "parentData": { "$push": { "$cond": { "if": { "$eq": ["$parent_category", null] }, "then": { "category_name": "$category_name", "parent_category": "$parent_category" }, "else": null } } } } }, { "$project": { "findParent": { "$setIntersection": ["$categories", "$parentData"] }, "categories": { "$setDifference": ["$categories", "$parentData"] } } }, { "$unwind": "$findParent" }, { "$project": { "category_name": "$findParent.category_name", "categories": 1 } }).pretty() 

为了按字段对logging进行分组,请Aggreegation中使用$ group 。这对我有用

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

参考 : MongoDB聚合

希望这个作品。