微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MongoDB 使用 mongoose 填充一个字段并计算嵌套布尔字段中的“真”值总数

如何解决MongoDB 使用 mongoose 填充一个字段并计算嵌套布尔字段中的“真”值总数

我有两个结构的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}} osbrowser 对象中每个字段的布尔值。我正在寻找的输出结构是 -

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。