Mongodb 将具有相似数据的对象分组并使用mongoose重新格式化
Javascript将具有相似数据的对象数组分组,并使用mongoose重新格式化 mongoose在聚合项目的数组中获取项 我有一个数组的对象,我想集团产生这个结果Mongodb 将具有相似数据的对象分组并使用mongoose重新格式化,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,Javascript将具有相似数据的对象数组分组,并使用mongoose重新格式化 mongoose在聚合项目的数组中获取项 我有一个数组的对象,我想集团产生这个结果 data:[{ user_name: 'Jenny Lawrence', inner_data:[{ "Back Pack":"Black", "produced":"2019", "manu_year":"2019",
data:[{
user_name: 'Jenny Lawrence',
inner_data:[{
"Back Pack":"Black",
"produced":"2019",
"manu_year":"2019",
"item_state":"produced",
"expiration":"unknown"
},
{
other data belonging to jenny lawrence is formated like above
}]
"inner_data":{
"detail":{"personal_item":"Baseball",
"manu_year":"2015","item_state":"purchased","color":"White","expiration":"unknown"}}
}]
这是数据
"data":[
{"user_name":"Jenny Lawrence", "inner_data":{
"detail":{"personal_item":"Back Pack","manu_year":"2019","item_state":"produced",
"color":"Black","expiration":"unknown"}}},
{"user_name":"Steven Benjjy",
"inner_data":{
"detail":{"personal_item":"Sneakers",
"manu_year":"2019","item_state":"purchased","color":"White","expiration":"unknown"}}},
{"user_name":"Steven Benjjy",
"inner_data":{
"detail":{"personal_item":"Baseball",
"manu_year":"2018","item_state":"purchased","color":"White","expiration":"unknown"}}},
{"user_name":"Jenny Lawrence",
"inner_data":{
"detail":{"personal_item":"Baseball",
"manu_year":"2015","item_state":"purchased","color":"White","expiration":"unknown"}}},
{"user_name":"Jenny Lawrence",
"inner_data":{
"detail":{"personal_item":"iPhone",
"manu_year":"2019","item_state":"purchased","color":"White","expiration":"unknown"}}},
{"user_name":"Daniel Stone",
"inner_data":{
"detail":{"personal_item":"Android Phone",
"manu_year":"2019","item_state":"purchased","color":"Stone grey","expiration":"unknown"}}},
{"user_name":"Daniel Stone",
"inner_data":{
"detail":{"personal_item":"iPad",
"manu_year":"2019","item_state":"refurbished","color":"White","expiration":"unknown"}}}]}
我想按用户名对项目进行分组,将personal_项目中的数据作为名称,将颜色值作为数据/值,并对
item_state和manu_year,但将其他项以其正常格式全部作为数组的对象
如何在mongoose中实现这一点您需要将MongoDB的聚合框架与某些阶段/运营商结合使用:
db.collection.aggregate([
/** group on user_name & push data to inner_data field */
{
$group: {
_id: "$user_name",
inner_data: {
$push: {
/** merge existing 'inner_data.detail' with new fields */
$mergeObjects: [
"$inner_data.detail",
{
/** As certain fields are being formed as an array, convert those to k:v pairs */
$arrayToObject: [
[
{
k: "$inner_data.detail.personal_item",
v: "$inner_data.detail.color"
},
{
k: "$inner_data.detail.item_state",
v: "$inner_data.detail.manu_year"
}
]
]
}
]
}
}
}
},
/** Optional, but this stage can be helpful to remove unnecessary fields */
{
$project: {
"inner_data.color": 0,
"inner_data.personal_item": 0
}
}
]);
测试:
参考:
上述查询为所有用户提供了相同的内部_数据结构,以防您仅为Jenny Lawrence需要这种转换的内部_数据结构
&对于其他用户,请使用相同的旧内部\u数据,然后尝试以下操作:
/** All the difference it brings is conditional check before push */
db.collection.aggregate([
{
$group: {
_id: "$user_name",
inner_data: {
$push: {
$cond: [
{
$eq: [
"$user_name",
"Jenny Lawrence"
]
},
{
$mergeObjects: [
"$inner_data.detail",
{
$arrayToObject: [
[
{
k: "$inner_data.detail.personal_item",
v: "$inner_data.detail.color"
},
{
k: "$inner_data.detail.item_state",
v: "$inner_data.detail.manu_year"
}
]
]
}
]
},
"$inner_data"
]
}
}
}
},
{
$project: {
"inner_data.color": 0,
"inner_data.personal_item": 0
}
}
])
测试:您需要将MongoDB的聚合框架与某些阶段/运营商结合使用:
db.collection.aggregate([
/** group on user_name & push data to inner_data field */
{
$group: {
_id: "$user_name",
inner_data: {
$push: {
/** merge existing 'inner_data.detail' with new fields */
$mergeObjects: [
"$inner_data.detail",
{
/** As certain fields are being formed as an array, convert those to k:v pairs */
$arrayToObject: [
[
{
k: "$inner_data.detail.personal_item",
v: "$inner_data.detail.color"
},
{
k: "$inner_data.detail.item_state",
v: "$inner_data.detail.manu_year"
}
]
]
}
]
}
}
}
},
/** Optional, but this stage can be helpful to remove unnecessary fields */
{
$project: {
"inner_data.color": 0,
"inner_data.personal_item": 0
}
}
]);
测试:
参考:
上述查询为所有用户提供了相同的内部_数据结构,以防您仅为Jenny Lawrence需要这种转换的内部_数据结构
&对于其他用户,请使用相同的旧内部\u数据,然后尝试以下操作:
/** All the difference it brings is conditional check before push */
db.collection.aggregate([
{
$group: {
_id: "$user_name",
inner_data: {
$push: {
$cond: [
{
$eq: [
"$user_name",
"Jenny Lawrence"
]
},
{
$mergeObjects: [
"$inner_data.detail",
{
$arrayToObject: [
[
{
k: "$inner_data.detail.personal_item",
v: "$inner_data.detail.color"
},
{
k: "$inner_data.detail.item_state",
v: "$inner_data.detail.manu_year"
}
]
]
}
]
},
"$inner_data"
]
}
}
}
},
{
$project: {
"inner_data.color": 0,
"inner_data.personal_item": 0
}
}
])
测试: