2016-09-07 87 views
0

通过字的至少出现次数排序结果我的视频集合:猫鼬:在阵列

var VideoSchema = new mongoose.Schema({ 
    url: { 
    type: String, required : true 
    }, 
    orderBy: { 
    type: Number 
    }, 
    views: [{ 
    type: String 
    }] 
}); 

“排序依据”让我确定我在其中担任影片的顺序

“若干意见”是用户名列表,那些观看过视频的用户。

我想阻止用户再次观看相同的视频,直到他们观看了收藏中的所有视频。因此,我保留观看过视频的用户的姓名。

现在我使用“排序”查询视频。

return this.find(videoQuery) 
.skip(offset) 
.limit(count || 10) // @todo 10 : param 
.sort({views: {$meta: username}, 'orderBy': -1}) 
.exec(); 

而我得到的错误信息:

Can't canonicalize query: BadValue bad sort specification 

你能帮忙吗?

+0

我相信我只能使用'textScore'作为$ meta的值,所以对我的用例没用:查询中的参数不是我想'textScore'的那些,我只是想要用户名。 我已经找了几个小时,但我似乎无法找到mongodb文档的解决方案。 – user6403833

回答

0

可能是错误的,但来自mongo文档。当您在排序中指定$ meta时,您需要将其包含在projectedFieldName中。

https://docs.mongodb.com/manual/reference/operator/projection/meta/#proj._S_meta

所以它应该看起来像这样

return this.find(videoQuery, { views: { $meta: 'textScore' } }) .skip(offset) .limit(count || 10) // @todo 10 : param .sort({views: {$meta: textScore}, 'orderBy': -1}) .exec();

修订 似乎$元只接受 'textScore' 作为@Pierre提及。

因此,另一个建议是当响应来自数据库时,使用下划线或原生js对数据进行排序。这会效率较低,可能需要进行一些调整,但这肯定会起作用。

希望这会有所帮助。

+0

谢谢,你让我更进一步。我得到了一个新的错误:无法canonicalize查询:BadValue不支持$ meta操作符:'用户名' 我相信我只能使用'textScore'作为$ meta的值,所以它对我的用例无用:查询不是我想'textScore'的,我只是想要用户名。 我已经找了几个小时,但我似乎无法找到mongodb文档的解决方案。 – user6403833

+0

那么,如果是这样的情况比它的不好,$ meta操作符需要更多的功能((((。 –

+0

Btw ..也许你从数据库响应来排序它们..用JS我认为这将是非常容易的,使用下划线。 。或原生js。 –