这对你来说可能听起来很简单,但我已经花了3个多小时来实现它,但我被困在了中途。
输入
问题陈述:我需要从数据库中找到满足以下条件的所有文档:
查询:如何实现requirement#3。
我的尝试:在我的尝试中,我只能在关键字匹配的基础上列出(这也不会使权重与2相乘)。
标记是文档的数组。结构,每个标记的结构如下
{
"id" : "ICC",
"some Other Key" : "some Other value"
}关键字是字符串数组:
["women", "cricket"]查询:
var predicate = [
{
"$match": {
"$or": [
{
"keywords" : {
"$in" : ["cricket", "women"]
}
},
{
"tags.id" : {
"$in" : ["ICC"]
}
}
]
}
},
{
"$project": {
"title":1,
"_id": 0,
"keywords": 1,
"weight" : {
"$size": {
"$setIntersection" : [
"$keywords" , ["cricket","women"]
]
}
},
"tags.id": 1
}
},
{
"$sort": {
"weight": -1
}
}
]; 发布于 2015-06-25 13:47:28
看起来,您的尝试很接近,但是您当然需要实现一些东西来“匹配您的逻辑”,以获得您想要的最终“得分”值。
这只是一个稍微改变投影逻辑的问题,并且假设“关键字”和“标记”都是文档中的数组:
db.collection.aggregate([
// Match your required documents
{ "$match": {
"$or": [
{
"keywords" : {
"$in" : ["cricket", "women"]
}
},
{
"tags.id" : {
"$in" : ["ICC"]
}
}
]
}},
// Inspect elements and create a "weight"
{ "$project": {
"title": 1,
"keywords": 1,
"tags": 1,
"weight": {
"$add": [
{ "$multiply": [
{"$size": {
"$setIntersection": [
"$keywords",
[ "cricket", "women" ]
]
}}
,2] },
{ "$size": {
"$setIntersection": [
{ "$map": {
"input": "$tags",
"as": "t",
"in": "$$t.id"
}},
["ICC"]
]
}}
]
}
}},
// Then sort by that "weight"
{ "$sort": { "weight": -1 } }
])因此,这里基本的$map逻辑是“转换”另一个数组,只给出id值,以便与所需的"set“解决方案进行比较。
$add操作符向您想要“加权”您的响应的成员提供额外的“权重”。
https://stackoverflow.com/questions/31049822
复制相似问题