javascript - 没有字段名称的 Mongoose 结构聚合输出

标签 javascript node.js mongodb mongoose aggregation-framework

我正在使用聚合对子文档中的数据进行分页。子文档没有严格的架构,因此它们对于每个文档可能不同,这让我很难构建我的输出,因为我不知道子文档的字段名称。

我在用什么

蒙戈 3.0.0

Node 0.10.33

Mongoose 3.9.7

我的模型

var BodySchema = new Schema({random: String},{strict:false});

var FeedSchema = new Schema({
    name: String,
    body:[BodySchema]
});

我的数据是这样的

[{
    _id:"...",
    name:"Power Rangers feed",
    body:[
        {
            "_id":"...",
            "name" : "Jason",
            "colour" : "Red",
            "animal" : "T-rex"
        },
        {
            "_id":"...",
            "name" : "Billy",
            "colour" : "Blue",
            "animal" : "Triceratops"
        },
        {
            "_id":"...",
            "name" : "Zach",
            "colour" : "Black",
            "animal" : "Mastadon"
        }
    ]
},
{
    _id:"...",
    name:"Transformers feed",
    body:[
        {
            "_id":"...",
            "name" : "Optimus Prime",
            "team" : "Autobots",
            "class" : "leader"
            "alt-mode" : "truck"
        },
        {
            "_id":"...",
            "name" : "Bumblebee",
            "team" : "Autobots",
            "class" : "scout"
            "alt-mode" : "VW Beetle"
        },
        {
            "_id":"...",
            "name" : "Blaster",
            "team" : "Autobots",
            "class" : "Commmunicator"
            "alt-mode" : "Sterio"
        },
        {
            "_id":"...",
            "name" : "Hotrod",
            "team" : "Autobots",
            "class" : "Warrior"
            "alt-mode" : "Car"
        }
    ]
}]

我当前的聚合代码如下所示

feed.aggregate([
    {'$match':{_id:id('550234d3d06039d507d238d8')}},
    {'$unwind':'$body'},
    {'$skip':2},
    {'$limit':2},
    {
        '$project': {
            '_id':"$body._id",
            'body': "$body"
        }

    },
], function(err, result){

    if(err){return(res.send(500, err))}

    res.send(result);

});

我目前的结果是这样的

[{
    _id:"...",
    body:{
        "_id":"...",
        "name" : "Blaster",
        "team" : "Autobots",
        "class" : "Commmunicator"
        "alt-mode" : "Sterio"
    }
},
{
    _id:"...",
    body:{
        "_id":"...",
        "name" : "Hotrod",
        "team" : "Autobots",
        "class" : "Warrior"
        "alt-mode" : "Car"
    }
}]

我想要的结果是这样的

[
    {
        "_id":"...",
        "name" : "Blaster",
        "team" : "Autobots",
        "class" : "Commmunicator"
        "alt-mode" : "Sterio"
    },
    {
        "_id":"...",
        "name" : "Hotrod",
        "team" : "Autobots",
        "class" : "Warrior"
        "alt-mode" : "Car"
    }
]

我的问题

我怎样才能达到我想要的结果结构。

最佳答案

所以,你会讨厌这个,但这就是 $project 的方式和 $group聚合管道工作的各个阶段。您需要“显式”指定输出中所需的所有字段。因此:

feed.aggregate([
    {'$match':{_id:id('550234d3d06039d507d238d8')}},
    {'$unwind':'$body'},
    {'$skip':2},
    {'$limit':2},
    {
        '$project': {
            '_id':"$body._id",
            'name': '$body.name',
            'team': '$body.team',
            'class': '$body.alt-mode'
        }
    },
], function(err, result){

这确实是唯一的方法。

虽然这背后确实有一个强有力的推理,并且大多数原则都在 SQL SELECT 中得到支持,但适用的 *“通配符”除外。

一般前提是这在一般操作中类似于 unix pipe 所以如果你这样想:

grep | awk | sed

那么这些操作在结构上看起来更合乎逻辑。

关于javascript - 没有字段名称的 Mongoose 结构聚合输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29076457/

相关文章:

node.js - 无法捕获 for wait of 循环中的错误

node.js - 执行文件后在 CLI 上继续

mongodb - 使用 $toLower 更新 MongoDB 集合

javascript - 如何让timeago.js自动更新

javascript - 使用嵌入式 VB6 浏览器无法加载 Google map v3.19

javascript onclick 函数未定义 Internet Explorer

node.js - 将 firebase 数据 Node 导出为 pdf 报告

mongodb map 数据在一个集合中

mongodb - Geonear 和多个 2dsphere 索引

javascript - 是否存在具有特定innerHTML 的元素?