gpt4 book ai didi

node.js - 如何使用来自其他模型的数据过滤 Mongoose 模型中的文档

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

比如我有3个模型:

故事:

{
title: { type: String },
text: { type: String }
}

评论:

{
text: { type: String },
story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" }
}

喜欢:

{
story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" }
}

如果流行是由评论和喜欢的数量决定的,我如何获得最流行的故事?例如,如果故事有更多评论和点赞,它就会更受欢迎。

谢谢。

更新:示例数据。

Stories: 
{
"title": "First story",
"text": "This must be the MOST popular story..."
}

{
"title": "Second story",
"text": "This story is popular too, but not as the first story."
}

{
"title": "Third story",
"text": "This is a unpopular story, because dont have any comment or like"
}


Comments:
{
"title": "Foo",
"story": ObjectId("First Story ID")
}

{
"title": "Foobar",
"story": ObjectId("First Story ID")
}

{
"title": "Bar",
"story": ObjectId("Second Story ID")
}


Likes:
{ "story": ObjectId("First Story ID") }
{ "story": ObjectId("First Story ID") }
{ "story": ObjectId("First Story ID") }
{ "story": ObjectId("First Story ID") }

{ "story": ObjectId("Second Story ID") }
{ "story": ObjectId("Second Story ID") }

{ "story": ObjectId("Third Story ID") }

过滤后的结果应该是这样的:

  1. 第一个故事(4 个赞,2 条评论)
  2. 第二个故事(2 个赞,1 条评论)
  3. 第三个故事(1 个赞)

最佳答案

如果您想根据流行度 对数据进行排序,其中流行度由(喜欢的总数 + 评论总数) 定义,那么您可以使用此聚合 使用 $lookup 查询。

db.getCollection('stories').aggregate([
{$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}},
{$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}},
{ $project: { title: 1, text: 1,comments:1,likes:1, count: { $add: [ {$size: "$comments"}, {$size: "$likes"} ] } } },
{$sort:{"count":-1}}
])

对于 Mongoose :

StoryModelName.aggregate([
{$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}},
{$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}},
{ $project: { title: 1, text: 1,comments:1,likes:1, count: { $add: [ {$size: "$comments"}, {$size: "$likes"} ] } } },
{$sort:{"count":-1}}
]).exec(function(err, values) {
if(err) {
// return error
}
// return values
})

如果您想按赞然后评论评论然后赞排序。

可以使用这个查询:

StoryModelName.aggregate([
{$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}},
{$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}},
{$group:{_id:"$_id",
totalLikes: {$sum:{$size: "$likes"}},
totalComments:{$sum:{$size: "$comments"}},
likes:{$first:"$likes"},
comments:{$first:"$comments"}
}
},
{$sort:{totalLikes:-1,totalComments:-1}} // can be comments ten like as you need
]).exec(function(err, values) {
if(err) {
// return error
}
// return values
})

关于node.js - 如何使用来自其他模型的数据过滤 Mongoose 模型中的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41503756/

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