Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB使用对象数组聚合对象?_Mongodb_Aggregation Framework - Fatal编程技术网

MongoDB使用对象数组聚合对象?

MongoDB使用对象数组聚合对象?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,以下是我在json中收集的一部分: [{"company":"Lenovo", "models": [{"model":"ThinkPad T400", "gens": [{"gen":"3", "start":2012}, {"gen":"2", "start":2008}, {"gen":"1", "start":2004}] }...] }...] 我正在尝试生成一个聚合命令,该命令将返回以下内容: [{ "_id":"

以下是我在
json
中收集的一部分:

[{"company":"Lenovo", "models": 
    [{"model":"ThinkPad T400", "gens": 
        [{"gen":"3", "start":2012},
        {"gen":"2", "start":2008},
        {"gen":"1", "start":2004}]
    }...]
}...]
我正在尝试生成一个聚合命令,该命令将返回以下内容:

[{ "_id":"Lenovo", 
  "models":[{ "model": "ThinkPad T400", 
              "gens":["1","2","3"]
            }...]
}...]
我尝试了以下聚合命令,但无效:

db.makes.aggregate([{
    $group:{
        _id: '$company',
        models: { $push:  { 
            model: "$models.model", 
            gen: "$models.gens.gen"
        }} 
    } 
}])
我得到这个结果:

[{ "_id":"Lenovo", 
  "models":[{ "model": ["ThinkPad T400"], 
              "gens":[ ["1","2","3"] ]
            }...]
}...]
这可能是因为每个my对象都有一个对象数组(模型),而对象也有一个对象数组(Gens)

什么是对MongoDB的正确请求,可以返回我的预期结果?

尝试以下查询:

db.makes.aggregate([
{$unwind : '$models'},
{
    $group:{
        _id: '$company',
        models: { $push:  { 
            model: "$models.model", 
            gen: "$models.gens.gen"
        }} 
    }
}])
输出将是

{
    "_id" : "Lenovo",
    "models" : [ 
        {
            "model" : "ThinkPad T400",
            "gen" : [ 
                "3", 
                "2", 
                "1"
            ]
        }
    ]
}

我可能遗漏了一些东西,但在我看来,您的原始数据与您想要得到的非常相似。是否有多个文档将
公司
设置为
联想

如果没有,您可以使用更简单的命令获得所需的内容:

db.makes.find({}, {_id: 0, company: 1, "models.model": 1, "models.gens.gen": 1 });
这并不是你想要的结果:

{
  "company": "Lenovo",
  "models": [
    {
      "model": "ThinkPad T400",
      "gens": [
        {
          "gen": 3
        },
        {
          "gen": 2
        },
        {
          "gen": 1
        }
      ]
    }
  ]
}

只有在公司字段已经是唯一的情况下,它才会起作用,但是MongoDB提供它会更容易,因为您不必使用聚合框架,也不需要展开任何可能的长数组。

使用$unwind操作符弹出并访问对象

我的数据是

我的查询是在进行聚合时进行的

[{$unwind : '$geolocation'},
     {
       $group:
         {
           _id: {city:"$geolocation.city",year: { $year: "$geolocation.date" }},
           count: { $sum: 1 }
         }
     }
   ]
结果:

{
    "_id" : {
        "city" : "Bengaluru",
        "year" : 2020
    },
    "count" : 3.0
}