gpt4 book ai didi

具有排名/搜索计数的 Mongodb

转载 作者:可可西里 更新时间:2023-11-01 10:16:10 26 4
gpt4 key购买 nike

大家好!

我试图寻找解决方案 3 天,但找不到任何解决方案。希望你们能帮助我。

数据

{       
'item': 'pen-1',
'colors': [ 'yellow', 'green', 'blue', 'red', 'pink', 'purple' ] //total: 6
},
{
'item': 'pen-2',
'colors': [ 'green', 'blue','pink', 'purple' ] //total: 4
}

这是我到目前为止所做的查询:

var col = ['yellow', 'red', 'blue'];
db.getCollection('data').aggregate([
{ $match: { colors : { $in : col } } },
{ $group: { _id: { 'item': '$item', colors: { $size : '$colors' } } } }
])

结果

{
"_id" : {
"item" : "pen-1",
"colors" : 6
}
}
{
"_id" : {
"item" : "pen-2",
"colors" : 4
}
}

我想做什么:

返回,返回总计(颜色/匹配的颜色)所以它会是这样的:

"_id" : {
"item" : "pen-1",
"rank": 0.5 // total colors(6) / that match(3)
}

"_id" : {
"item" : "pen-2",
"rank": 0.25 // total colors(4) / that match(1)
}

最佳答案

您可以使用 $setIntersection 运算符,它接受两个或多个数组并返回一个包含出现在每个输入数组中的元素的数组。然后您可以使用 $size 返回结果数组中元素的数量以获得匹配的总颜色。

如果使用 MongoDB 3.4 和更新版本,则 $addFields 将允许您向文档添加一个额外的字段而无需显式投影其余字段,否则 $project 就足够了。

下面的例子展示了这一点:

var col = ['yellow', 'red', 'blue'];
db.getCollection('data').aggregate([
{ "$match": { "colors": { "$in": col } } },
{
"$addFields": {
"rank": {
"$divide": [
{ "$size": { "$setIntersection": ["$colors", col] } },
{ "$size": "$colors" }
]
}
}
},
{ "$sort": { "rank": 1 } }
])

示例输出

/* 1 */
{
"_id" : ObjectId("58c645eaf3d1c82da16279a6"),
"item" : "pen-2",
"colors" : [
"green",
"blue",
"pink",
"purple"
],
"rank" : 0.25
}

/* 2 */
{
"_id" : ObjectId("58c645eaf3d1c82da16279a5"),
"item" : "pen-1",
"colors" : [
"yellow",
"green",
"blue",
"red",
"pink",
"purple"
],
"rank" : 0.5
}

关于具有排名/搜索计数的 Mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42757391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com