使用mongoose的最大查询

时间:2017-10-02 21:55:41

标签: javascript node.js mongodb mongoose

我是mongoose的新手,仍在努力了解如何进行正确的查询

我有2个简单的模型

用户

const UserSchema = new Schema({
name: String,
age: Number,
movies:[{
    type: Schema.Types.ObjectId,
    ref: 'movie'
}]
}, { collection: 'USER_COLLEC' });

电影

 const MovieSchema = new Schema({
    title:String , 
    duration: Number
}, { collection: 'MOVIE_COLLEC' });

我想要的是具有最长电影的用户(持续时间最长)

现在我明白了:

db.getCollection('USER_COLLEC') .
aggregate([
{ "$unwind": "$movies" } ,
{ $lookup:
    {from: "MOVIE_COLLEC",
    localField: "movies",
    foreignField: "_id",
    as: "movieContent"},
 } ,
 { $unwind: "$movieContent" },
 { $group: 
    { maxDuration: { $max: "$movieContent.duration" }, 
    }
  }
])

但它只能找到没有用户附加的最大持续时间...... 事实上,我只询问查询的最长持续时间,但在查找之后我失去了我的用户:(

我如何保留或检索用户数据?

如果你有任何想法,我完全陷入困境......

谢谢你们!

2 个答案:

答案 0 :(得分:1)

您也可以使用$ push来获取电影对象。

db.getCollection('USER_COLLEC') .
aggregate([
{ "$unwind": "$movies" } ,
{ $lookup:
    {from: "MOVIE_COLLEC",
    localField: "movies",
    foreignField: "_id",
    as: "movieContent"},
 } ,
 { $unwind: "$movieContent" },
 { $group: 
    { _id: { $max: "$movieContent.duration" }, 
    "movie": {
            "$push": "movieContent"
        }
    }
  }
])

在此之后,只需在用户的电影数组中搜索电影的_id

UserSchema.find({movies:{$in:movieContent[0]._id}});

或者,您也可以使用$push

代替$first
{ $first: "$movieContent" }

然后你不会在数组中得到它。

<强>更新

而不是{$push: $movieContent}{$first: $movieContent},你可以推$$ROOT
{$push: $$ROOT}{$first: $$ROOT} 然后你将获得整个对象。您不需要触发另一个查询来获取用户。

答案 1 :(得分:0)

我终于找到了解决方案,$ group不是解决方案

{
    "_id" : ObjectId("59d2f64dded1c008192f7e73"),
    "user" : "Michael",
    "duration" : 96
}

这给了我类似的东西:

A