gpt4 book ai didi

node.js - 查询 MongoDb 以从引用 id 数组的集合中获取计数

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:09 26 4
gpt4 key购买 nike

我总共有3个收藏:1. 用户2. 帖子3. 行动

我的收藏如下:

用户:

{ 
"_id" : ObjectId("57ee65fef5a0c032877725db"),
"fbId" : "EAAXZA4sZCZBKmgBAKe0JpJPrp7utWME6xbHT9yFD",
"name" : "Aftab",
"email" : "xxxe@hotmail.com",
"gender" : "male",
"__v" : NumberInt(0),
"updatedAt" : ISODate("2016-10-10T05:11:35.344+0000"),
"score" : NumberInt(90)
}

操作:

{ 
"_id" : ObjectId("57f7a0ba3a603627658afdd3"),
"updatedAt" : ISODate("2016-10-07T13:18:50.815+0000"),
"createdAt" : ISODate("2016-10-07T13:18:50.815+0000"),
"userId" : ObjectId("57ee65fef5a0c032877725db"),
"postId" : ObjectId("57f4b5e98899081203883a1b"),
"type" : "like"
}
{
"_id" : ObjectId("57f7a0ba3a603627658afdd4"),
"updatedAt" : ISODate("2016-10-07T13:18:50.815+0000"),
"createdAt" : ISODate("2016-10-07T13:18:50.815+0000"),
"userId" : ObjectId("57ee65fef5a0c032877725db"),
"postId" : ObjectId("57f4b5d58899081203883a1a"),
"type" : "dismiss"
}

帖子:

{ 
"_id" : ObjectId("57f24593e272b5199e9351b9"),
"imgFileLocation" : "http://xxxx/buybye-platform/uploads/image-1475495315229",
"description" : "cool cool",
"title" : "Bad Image ",
"userId" : ObjectId("57f21e3d0b787d0f7ad76dd0"),
"__v" : NumberInt(0)
}
{
"_id" : ObjectId("57f4b5d58899081203883a1a"),
"imgFileLocation" : "http://xxx/buybye-platform/uploads/image-1475655125125",
"description" : "cool & cool",
"title" : "Good Image",
"userId" : ObjectId("57f21e3d0b787d0f7ad76dd0"),
"__v" : NumberInt(0)
}

用户可以创建帖子,其他用户可以对这些帖子执行操作

posts 集合有一个 userId 的引用操作集合包含 userId(谁执行了该操作)、postId(在哪个帖子上)和操作类型(喜欢/不喜欢/拒绝)的引用

我需要查询以获取对特定用户帖子执行的所有操作

我能够获取针对某个用户的所有帖子,这非常简单,并且是一个数组。现在我需要获取对此帖子数组的每个帖子执行的所有操作。

最佳答案

如果您想要一个利用聚合框架的解决方案,可以使用从 MongoDB v3.2 开始引入的 $lookup 阶段。

例如,如果您想返回一个包含帖子详细信息的结果集以及对该特定帖子执行的所有操作的数组,则可以运行以下聚合查询:

/*
* QUERY #1
*/
db.posts.aggregate([
{
$lookup: {
from: 'actions',
localField: '_id',
foreignField: 'postId',
as: 'post_actions'
}
}
]);

/*
* RESULT SET #1
*/
{
"_id" : ObjectId("57ff4512a134e614a7178c1d"),
"imgFileLocation" : "http://xxxx/buybye-platform/uploads/image-1475495315229",
"description" : "cool cool",
"title" : "Bad Image ",
"userId" : ObjectId("57f21e3d0b787d0f7ad76dd0"),
"__v" : 0,
"post_actions" : [
{
"_id" : ObjectId("57ff4563a134e614a7178c1e"),
"updatedAt" : ISODate("2016-10-07T13:18:50.815Z"),
"createdAt" : ISODate("2016-10-07T13:18:50.815Z"),
"userId" : ObjectId("57ee65fef5a0c032877725db"),
"postId" : ObjectId("57ff4512a134e614a7178c1d"),
"type" : "like"
},
{
"_id" : ObjectId("57ff4564a134e614a7178c1f"),
"updatedAt" : ISODate("2016-10-07T13:18:50.815Z"),
"createdAt" : ISODate("2016-10-07T13:18:50.815Z"),
"userId" : ObjectId("57ee65fef5a0c032877725db"),
"postId" : ObjectId("57ff4512a134e614a7178c1d"),
"type" : "share"
}
]
}

否则,如果您只想检索特定帖子数组的操作,可以在聚合管道中添加 $match 阶段:

const postIdsArray = [
ObjectId("57ff4512a134e614a7178c1d"),
ObjectId("57ee65fef5a0c032877725db")
];

/*
* QUERY #2
*/
db.posts.aggregate([
{
$match: {
_id: {
$in: postIdsArray
}
}
},
{
$lookup: {
from: 'actions',
localField: '_id',
foreignField: 'postId',
as: 'post_actions'
}
}
]);

此外,如果您只想检索对帖子执行的操作总数,您可以添加 $unwind 阶段,然后添加 $group 所有结果:

/*
* QUERY #3
*/
db.posts.aggregate([
{
$lookup: {
from: 'actions',
localField: '_id',
foreignField: 'postId',
as: 'post_actions'
}
},
{
$unwind: '$post_actions'
},
{
$group: {
_id: '$_id',
posts: { $sum: 1 }
}
}
]);

/*
* RESULT SET #3
*/
{ "_id" : ObjectId("57ff4512a134e614a7178c1d"), "posts" : 2 }

更新#1

如果您只想检索特定类型的操作(例如:点赞、分享等),则可以在 $unwind$lookup 阶段检索到的 post_actions 数组之后,在聚合管道中添加额外的 $match 阶段。

例如,第一个查询将变为:

/*
* UPDATED QUERY #1
*/
db.posts.aggregate([
{
$lookup: {
from: 'actions',
localField: '_id',
foreignField: 'postId',
as: 'post_actions'
}
},
{
$unwind: '$post_actions'
},
{
$match: {
"post_actions.type": 'like'
}
}
]);

第二个查询将变为:

const postIdsArray = [
ObjectId("57ff4512a134e614a7178c1d"),
ObjectId("57ee65fef5a0c032877725db")
];

/*
* UPDATED QUERY #2
*/
db.posts.aggregate([
{
$match: {
_id: {
$in: postIdsArray
}
}
},
{
$lookup: {
from: 'actions',
localField: '_id',
foreignField: 'postId',
as: 'post_actions'
}
},
{
$unwind: '$post_actions'
},
{
$match: {
"post_actions.type": 'like'
}
}
]);

第三个查询将变为:

/*
* UPDATED QUERY #3
*/
db.posts.aggregate([
{
$lookup: {
from: 'actions',
localField: '_id',
foreignField: 'postId',
as: 'post_actions'
}
},
{
$unwind: '$post_actions'
},
{
$match: {
"post_actions.type": 'like'
}
},
{
$group: {
_id: '$_id',
posts: { $sum: 1 }
}
}
]);

关于node.js - 查询 MongoDb 以从引用 id 数组的集合中获取计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015209/

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