首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用mongoDB实现基于元素属性的数组元素数据采集

如何利用mongoDB实现基于元素属性的数组元素数据采集
EN

Stack Overflow用户
提问于 2018-04-13 17:26:09
回答 2查看 64关注 0票数 0

看起来真的很简单,任何语言都是4-5行。我真的被困住了!我已经拥有的是:

代码语言:javascript
复制
/* 1 */
{
    "_id" : ObjectId("5ad078cc43c90bb8118b457b"),
    "totalTime" : 323,
    "qData" : [ 
        {
            "qId" : "123456",
            "weight" : 38
        }, 
        {
            "qId" : "654321",
            "age" : 21
        },       
        {
            "qId" : "123456",
            "age" : 14
        }, 
        {
            "qId" : "654321",
            "height" : 122
        }, 
        {
            "qId" : "654321",
            "weight" : 34
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5ad084cc43c90bb8118b4583"),
    "totalTime" : 312,
     "qData" : [ 
        {
            "qId" : "123456",
            "weight" : 42
        }, 
        {
            "qId" : "654321",
            "age" : 21
        },       
        {
            "qId" : "123456",
            "age" : 15
        }, 
        {
            "qId" : "654321",
            "height" : 124
        }, 
        {
            "qId" : "654321",
            "weight" : 40
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5ad0853143c90bf4088b457b"),
    "totalTime" : NumberLong(20),
     "qData" : [ 
        {
            "qId" : "123456",
            "weight" : 48
        }, 
        {
            "qId" : "654321",
            "age" : 22
        },       
        {
            "qId" : "123456",
            "age" : 19
        }, 
        {
            "qId" : "654321",
            "height" : 162
        }, 
        {
            "qId" : "654321",
            "weight" : 39
        }
    ]
}

还有我要去的地方。这只是在每个元素的qData数组中为每个document收集数据。文档(记录)根本不混合它们的数据(qData)。

代码语言:javascript
复制
/* 1 */
{
    "_id" : ObjectId("5ad078cc43c90bb8118b457b"),
    "totalTime" : 323,
    "qData" : [ 
        {
            "qId" : "123456",
            "weight" : 38,
            "age" : 14
        }, 
        {
            "qId" : "654321",
            "age" : 21,
            "height" : 122,
            "weight" : 34
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5ad084cc43c90bb8118b4583"),
    "totalTime" : 312,
     "qData" : [ 
        {
            "qId" : "123456",
            "weight" : 42,
            "age" : 15
        }, 
        {
            "qId" : "654321",
            "age" : 21,
            "height" : 124,
            "weight" : 40
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5ad0853143c90bf4088b457b"),
    "totalTime" : NumberLong(20),
     "qData" : [ 
        {
            "qId" : "123456",
            "weight" : 48,
            "age" : 19
        }, 
        {
            "qId" : "654321",
            "age" : 22,
            "height" : 162,
            "weight" : 39
        }
    ]
}

我需要使用聚合框架来完成这个任务。已经尝试过$filter,与$map或$addToSet一起,已经花了10个小时在上面。找不到正确的组合。

更新:我忘了提到,我运行在3.4上,所以$mergeObjects不是一个没有更新的选项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-13 17:58:44

您可以在3.6中尝试在聚合下面。

代码语言:javascript
复制
db.collection.aggregate([
  {"$unwind":"$qData"},
  {"$group":{
    "_id":{"id":"$_id","qId":"$qData.qId"},
    "totalTime":{"$first":"$totalTime"},
    "mergedata":{"$mergeObjects":"$qData"}
  }},
  {"$group":{
    "_id":"$_id.id",
    "totalTime":{"$first":"$totalTime"},
    "qData":{"$push":"$mergedata"}
  }}
])

对于3.4,可以使用下面的查询。

代码语言:javascript
复制
db.collection.aggregate([
  {"$unwind":"$qData"},
  {"$group":{
    "_id":{"id":"$_id","qId":"$qData.qId"},
    "totalTime":{"$first":"$totalTime"},
    "arraydata":{"$push": {"$objectToArray":"$qData"}}
  }},
  {"$addFields":{"arraydata":{"$arrayToObject":{
     "$reduce":{
       "input":"$arraydata",
       "initialValue":[],
       "in":{"$concatArrays":["$$this","$$value"]}}
   }}}},
   {"$group":{
    "_id":"$_id.id",
    "totalTime":{"$first":"$totalTime"},
    "qData":{"$push": "$arraydata"}
  }}
])
票数 1
EN

Stack Overflow用户

发布于 2018-04-16 09:36:37

从维拉姆的回答中得到最好的一件事。走维拉姆的道路也会产生一些噪音,比如:

代码语言:javascript
复制
        {
            "qId" : "123456",
            "qId" : "123456",
            "weight" : 48,
            "age" : 19
        }

因此,我解决这个问题的方法是在减少数组的同时添加$setUnion

代码语言:javascript
复制
 $reduce : {
           input:"$arraydata",
           initialValue:[],
           in:{ $setUnion : {$concatArrays:["$$this","$$value"]}}
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49822283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档