gpt4 book ai didi

MongoDB:使用来自多个集合的数据进行过滤

转载 作者:行者123 更新时间:2023-12-05 04:10:26 26 4
gpt4 key购买 nike

我有一个应用程序以事件的形式存储用户及其行为。有两个集合,一个用于用户,一个用于事件。文件看起来像这样:

用户

{
"_id" : ObjectId("593aa71e2f9d5140000bb44e"),
"name" : "Antonette Ortiz",
"country" : "France"
}

事件

{
"_id" : ObjectId("593aaa84c685604066a6a0cf"),
"name" : "message_sent",
"timestamp" : ISODate("2016-11-01T04:39:52.667Z"),
"user" : ObjectId("593aa728d135484002399bac"),
"attributes" : {
"str" : "plum",
"int" : 82
}
}

现在我希望能够不仅根据用户的属性,还根据他们触发的事件以及特定时间范围来获取用户列表。

查询示例如下:“在过去 7 天内至少发送了 3 条消息的所有来自法国的用户”。

我如何使用 MongoDB 实现这一目标,以及在性能方面(例如,如果我有几百万个事件)?这甚至可以只使用这两个集合,还是我必须使用聚合/映射减少?如果是这样,您会建议如何更改架构?

最佳答案

根据 MongoDB 文档

The $lookup stage does an equality match between a field from the input documents with a field from the documents of the “joined” collection.

例如

“在过去 7 天内至少发送了 3 条消息的所有法国用户”。

要检索上述条件的数据,其聚合查询如下

db.Event.aggregate(

// Pipeline
[
// Stage 1
{
$match: {
name:'message_sent',
timestamp:{$gte:ISODate("2016-10-25T04:39:52.667+0000"),$lte:ISODate("2016-11-01T04:39:52.667+0000")}
}
},

// Stage 2
{
$group: {
_id:{user:'$user'},
counter:{$sum:1}
}
},

// Stage 3
{
$lookup: {
"from" : "User",
"localField" : "_id.user",
"foreignField" : "_id",
"as" : "user"
}
},

// Stage 4
{
$match: {
'user.country':'France' ,
counter:{$gte:3}
}
},

]



);

关于MongoDB:使用来自多个集合的数据进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44460658/

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