【发布时间】:2017-08-03 23:57:38
【问题描述】:
我有一个架构是:
var photoSchema = new mongoose.Schema({
id: String, // Unique ID identifying this photo
file_name: String,
date_time: {type: Date, default: Date.now},
user_id: mongoose.Schema.Types.ObjectId, // The user id of the user who created the photo.
comments: [commentSchema] // Comment objects representing the comments made on this photo.
});
var Photo = mongoose.model('Photo', photoSchema);
我正在尝试从具有最多 cmets 的特定用户那里找到照片。这是我所做的:
Photo.aggregate([
{
$project: {
id: 1,
file_name: 1,
date_time: 1,
user_id: 1,
comments: 1,
length: {$size: "$comments"}
}
},
{
$match: {
user_id: mongoose.Schema.Types.ObjectId(request.params.id)
}
},
{
$sort: { length: -1 }
}
], function (err, info2){
if (err) {
// Query returned an error.
console.error('Doing /user/usage/:id error:', err);
response.status(400).send(JSON.stringify(err));
return;
}
console.log(info2);
finalOutput.most_commented = info2[0];
response.end(JSON.stringify(finalOutput));
});
我在 console.log 中只得到一个空数组 [],我知道 $match 不起作用,因为如果我删除 $match 子句,它会为我提供整个表中最大 cmets 的照片。我想根据他们的 user_id 过滤并获取属于 1 个特定用户的照片。
我不明白我做错了什么。
我试过了:
1. $match: {user_id: mongoose.Schema.Types.ObjectId(request.params.id)}
2. $match: {user_id: request.params.id}
3. $match: {"user_id": request.params.id}
【问题讨论】:
-
^^ 谢谢!原来 ObjectId 的铸造似乎是问题所在。当它需要只是一个纯 ObjectId mongoose.Types.ObjectId 时,它使用 Schema 类型 Object Id mongoose.Schema.Types.ObjectId 进行转换。 (来源:stackoverflow.com/a/16312935/5382718)
-
昨晚我花了几个小时在这上面,太傻了! :D
-
@BNKS 它看起来很纤细,几乎是重复的,请你自己照顾它以使网站干净:)
标签: javascript node.js mongodb mongoose