Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
Javascript 如何使用聚合和展开返回文档和子数组?_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 如何使用聚合和展开返回文档和子数组?

Javascript 如何使用聚合和展开返回文档和子数组?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我使用以下mongoose查询从文档返回最流行的零食。文件如下: { "_id": ObjectId("58d7d2d760b78902f1df3fa2"), "user_id": ObjectId("58d2dd4c8207c28149dbc748"), "calories": 2000, "date": 20170226, "snacks": [ { "nutrients": { "protein": 7.5, "carbs": 56.5, "

我使用以下mongoose查询从文档返回最流行的零食。文件如下:

{
  "_id": ObjectId("58d7d2d760b78902f1df3fa2"),
  "user_id": ObjectId("58d2dd4c8207c28149dbc748"),
  "calories": 2000,
  "date": 20170226,
  "snacks": [
{
  "nutrients": {
    "protein": 7.5,
    "carbs": 56.5,
    "fat": 10.5
  },
  "servings": 23.8,
  "calories": 526,
  "name": "Dairy milk"
},
"dinner": [ ],
"lunch": [ ],
"breakfast": [ ]
}
然后,我使用以下查询:

user_food.aggregate({$unwind: $snacks},{$sortByCount: $snacks.name},function(err, results){
        if(err){
            console.log("something went wrong: " + err);
            return res.status(500).send(err);
        }
        else{
            return res.status(200).send(results);
        }
    });
这将返回:

_id:"Dairy milk"
count:3
我需要返回的是整个对象:

"nutrients": {
"protein": 7.5,
"carbs": 56.5,
"fat": 10.5
},
"servings": 23.8,
"calories": 526,
"name": "Dairy milk",
count:3
通过
\u id
+
$sort
相当于
$group
。要在
$group
阶段中添加更多字段,需要使用以获取指定字段的第一个值:

user_food.aggregate([{
    $unwind: "$snacks"
}, {
    $group: {
        _id: "$snacks.name",
        snacks: { $first: "$snacks" },
        count: { $sum: 1 }
    }
}, {
    $sort: {
        count: -1
    }
}], function(err, results) {
    if (err) {
        console.log("something went wrong: " + err);
        return res.status(500).send(err);
    } else {
        return res.status(200).send(results);
    }
});
您将得到如下结果:

{
    "snacks": {
        "nutrients": {
            "protein": 7.5,
            "carbs": 56.5,
            "fat": 10.5
        },
        "servings": 23.8,
        "calories": 526,
        "name": "Dairy milk",
    },
    count: 3
}
通过
\u id
+
$sort
相当于
$group
。要在
$group
阶段中添加更多字段,需要使用以获取指定字段的第一个值:

user_food.aggregate([{
    $unwind: "$snacks"
}, {
    $group: {
        _id: "$snacks.name",
        snacks: { $first: "$snacks" },
        count: { $sum: 1 }
    }
}, {
    $sort: {
        count: -1
    }
}], function(err, results) {
    if (err) {
        console.log("something went wrong: " + err);
        return res.status(500).send(err);
    } else {
        return res.status(200).send(results);
    }
});
您将得到如下结果:

{
    "snacks": {
        "nutrients": {
            "protein": 7.5,
            "carbs": 56.5,
            "fat": 10.5
        },
        "servings": 23.8,
        "calories": 526,
        "name": "Dairy milk",
    },
    count: 3
}

您的文档示例不是有效的JSONY您的文档示例不是工作正常的有效JSON。我对它进行了轻微的编辑,让用户可以决定选择哪一种食物,但除此之外,它的工作方式正是我所需要的。太谢谢你了,这很有效。我对它进行了轻微的编辑,让用户可以决定选择哪一种食物,但除此之外,它的工作方式正是我所需要的。非常感谢你。