如何按照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_category
为null
类别,并且子类别具有父类别的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
查询。 为了查找输出,我遵循以下步骤:
- 首先在
$project
检查parent_category
是否为true,然后添加_id
else addparent_category
。 - 现在,文档结构看起来像新的
key name as parent_id
呈现和由parent_id
分组,并推送其余的数据,如category_name and parent_category
。 - 之后,使用$ setDifference和$ setIntersection来区分父数据和子数据。
- 而在最后只
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聚合
希望这个作品。