问题描述
我有两个结构的mongo文档
链接文档
{
"_id": {
"$oid": "6002d2d627925c4194a15a94"
},"visit_count": 20,"password": null,"password_protected": false,"description": null,"analytics": [
{
"$oid": "6002d568e9c7d24d34413492"
},{
"$oid": "6002d612464785401824a782"
}
],"alias": "g","short_url": "https://reduced.me/g","long_url": "https://google.com","created": {
"$date": "2021-01-16T11:49:42.517Z"
},"__v": 2
}
分析文档
[
{
"_id": {
"$oid": "6002d568e9c7d24d34413492"
},"os": {
"windows": true,"linux": false,"mac": false,"android": false
},"browser": {
"opera": false,"ie": false,"edge": false,"safari": false,"firefox": true,"chrome": false
},"details": {
"os": "Windows 10.0","browser": "Edge","version": "87.0.664.75","platform": "Microsoft Windows","source": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75"
},"__v": 0
},{
"_id": {
"$oid": "6002d612464785401824a782"
},"edge": true,"firefox": false,"__v": 0
}
]
我想要做的是,使用 analytics 文档中的值填充 links 文档中的 analytics
数组,并总结 {{ 1}} os 和 browser 对象中每个字段的布尔值。我正在寻找的输出结构是 -
true
例如,这里的 {
"_id": null,"created": "2021-01-16T11:49:42.517Z","analytics": {
"os": {
"windows": 2,"linux": 0,"mac": 0,"android": 0
},"browser": {
"opera": 0,"ie": 0,"edge": 1,"safari": 0,"firefox": 1,"chrome": 0
}
}
}
显示了 windows:2
在整个文档中的值为 windows
的次数。
目前我是这样做的
true
这确实给出了这样的输出
const analytics = await LinkModel.aggregate([
{ $match: { short_url: req.body.short_url } },{
$lookup: {
from: 'analytics',localField: 'analytics',foreignField: '_id',as: 'analytics',},{ $unwind: '$analytics' },{
$group: {
_id: null,visit_count: { $first: '$visit_count' },password_protected: { $first: '$password_protected' },description: { $first: '$description' },alias: { $first: '$alias' },short_url: { $first: '$short_url' },long_url: { $first: '$long_url' },created: { $first: '$created' },windows: {
$sum: { $cond: ['$analytics.os.windows',1,0] },linux: {
$sum: { $cond: ['$analytics.os.linux',mac: {
$sum: { $cond: ['$analytics.os.mac',android: {
$sum: { $cond: ['$analytics.os.android',opera: {
$sum: { $cond: ['$analytics.browser.opera',ie: {
$sum: { $cond: ['$analytics.browser.ie',edge: {
$sum: { $cond: ['$analytics.browser.edge',safari: {
$sum: {
$cond: ['$analytics.browser.safari',0],firefox: {
$sum: {
$cond: ['$analytics.browser.firefox',chrome: {
$sum: {
$cond: ['$analytics.browser.chrome',])
它有我需要的所有数据,但结构不正确。我使用猫鼬作为 ORM。任何帮助,将不胜感激。谢谢。
解决方法
您可以使用 $addFields
来获得您想要的输出
db.collection.aggregate([
{
$addFields: {
"analytics": {
"os": {
"windows": "$windows","linux": "$linux","mac": "$mac","android": "$android"
},"browser": {
"opera": "$opera","ie": "$ie","edge": "$edge","safari": "$safari","firefox": "$firefox","chrome": "$chrome"
}
},"windows": "$$REMOVE","linux": "$$REMOVE","mac": "$$REMOVE","android": "$$REMOVE","opera": "$$REMOVE","ie": "$$REMOVE","edge": "$$REMOVE","safari": "$$REMOVE","firefox": "$$REMOVE","chrome": "$$REMOVE"
}
}
])
工作Debian