Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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,因此,我试图在MongoDB中执行一个aggregate调用来查找一个集合,但同时限制从另一个集合中获取的数据量。以下是我对这类作品的尝试: getFamilyStats: function (req, res) { Families .aggregate([ { $match: { 'centralPath': req.body.centralPath }}, { $lookup: { fr

因此,我试图在MongoDB中执行一个
aggregate
调用来查找一个集合,但同时限制从另一个集合中获取的数据量。以下是我对这类作品的尝试:

getFamilyStats: function (req, res) {
    Families
        .aggregate([
            { $match: { 'centralPath': req.body.centralPath }},
            { $lookup: {
                from: 'models',
                localField: 'centralPath',
                foreignField: 'centralPath',
                as: 'models'
            }},
            { $unwind: '$models'},
            { $project: {
                'models.openTimes.user': 1,
                '_id': 1,
                'centralPath': 1,
                'totalFamilies': 1,
                'unusedFamilies': 1,
                'oversizedFamilies': 1,
                'inPlaceFamilies': 1,
                'families': 1
            }}
            ]
        ).exec(function (err, response){
            var result = {
                status: 200,
                message: response
            };
            if (err){
                result.status = 500;
                result.message = err;
            } else if (!response){
                result.status = 404;
                result.message = err;
            }
            res.status(result.status).json(result.message);
        });
},
因此,我可以使用
lookup
来“连接”来自不同集合的数据,在本例中称为模型,这是一个非常有效的事实。一旦我
展开
它,它看起来就像我想要它一样,除了我只对该属性中的一个字段感兴趣:
models.openTimes
,在这种特殊情况下,实际上只有该字段的一个属性
user
。我试图使用
project
来限制我从模型中传递的大部分数据,但这迫使我解释所有其他字段,如:

_id: 1,
centralPath: 1....
如果我的收藏以新的属性扩展,那就不太理想了。我正在寻找一种方法,将
模型
中的数据限制为一个字段/一个属性,但从
系列
集合中获取所有字段

想法

族的示例数据:

{
    "_id" : ObjectId("5ae08c75d132ac4442520672"),
    "centralPath" : "some path",
    "totalFamilies" : 0,
    "unusedFamilies" : 0,
    "oversizedFamilies" : 0,
    "inPlaceFamilies" : 0,
    "families" : [],
    "__v" : 0
}
模型的示例数据:

{
    "_id" : ObjectId("5ae08c74d132ac4442520638"),
    "centralPath" : "some path",
    "openTimes" : [ 
        {
            "value" : 8123,
            "user" : "ks",
            "createdOn" : ISODate("2018-04-25T14:11:00.853Z"),
            "_id" : ObjectId("5ae08c74d132ac444252063a")
        }
    ],
    "synchTimes" : [ 
        {
            "value" : 208649,
            "user" : "ks",
            "createdOn" : ISODate("2018-04-25T16:42:42.933Z"),
            "_id" : ObjectId("5ae0b0028c2e3b192a3e9dc5")
        }
    ],
    "modelSizes" : [ 
        {
            "value" : 21483520,
            "user" : "ks",
            "createdOn" : ISODate("2018-04-25T14:11:00.787Z"),
            "_id" : ObjectId("5ae08c74d132ac4442520639")
        }
    ],
    "__v" : 0
}

您可以在3.4及更高版本中尝试以下聚合

$addFields
从合并的集合中返回唯一的字段,同时保留现有字段;以及
$project
排除以删除合并的集合数据

将项目阶段替换为addFields和project阶段

Families.aggregate([
 existing stages,
  {"$addFields":{
    "user":"$models.openTimes.user"
  }},
  {"$project":{"models":0}}
])

从MongoDB v3.6开始,您可以直接限制

db.families.aggregate([
    { $match: { 'centralPath': 'some path' } },
    { $lookup: {
        from: 'models',
        let: { centralPath: '$centralPath' }, // remember the value of the "centralPath" field
        pipeline: [
            { $match: { $expr: { $eq: [ '$centralPath',  '$$centralPath' ] } } }, // this performs the "join"
            { $project: { _id: 0, 'openTimes.user': 1 } } // only retrieve the "openTimes.user" field
        ],
        as: 'models'
    }},
    { $unwind: '$models'},
]);

良好的描述和更好的和简短的选择,以实现目标+你的逻辑:)嗨,维拉姆,你能回答这个问题吗