Mongodb过滤器连接
我有两个表:用户和付款。 我想过滤上个月注册的非活动用户的付款。 SQL等效项: 从付款中选择* 在u.id=payments.user\u id上内部加入用户u 其中u.active=0,date>now()-30*24*60*60 问题是mongo不支持连接。 我必须首先查询用户,然后使用用户id{$in:…}进行付款 桌子很大,而且很慢 现在想象一下,付款有产品id,我有一个大的产品表,必须添加一些产品过滤器。 产品有分类。 如果对于每个过滤器,我必须添加另一个查询,不仅速度不好,而且代码变得庞大而混乱 还有别的好办法吗Mongodb过滤器连接,mongodb,Mongodb,我有两个表:用户和付款。 我想过滤上个月注册的非活动用户的付款。 SQL等效项: 从付款中选择* 在u.id=payments.user\u id上内部加入用户u 其中u.active=0,date>now()-30*24*60*60 问题是mongo不支持连接。 我必须首先查询用户,然后使用用户id{$in:…}进行付款 桌子很大,而且很慢 现在想象一下,付款有产品id,我有一个大的产品表,必须添加一些产品过滤器。 产品有分类。 如果对于每个过滤器,我必须添加另一个查询,不仅速度不好,而且代码
谢谢以下mongo查询应该会有所帮助。请根据集合/属性名称对其进行建模
db.payments.aggregate([
{ $lookup: {
from: "users",
let: { payment_userid: "$user_id"},
pipeline: [
{ $match:
{ $expr:
{ $and:
[
{ $eq: [ "$$payment_userid", "$id"] },
{ $gt: [ { $subtract: [ new Date(), "$date" ] },numberLong(2592000000) ] }
]
}
}
}
],
as: "joineddata"
},
{"$match":{"joineddata" : {$ne:[]}}}
])
MongoDB确实支持某种类型的连接。签出$lookup:请注意,您可能希望以完全不同的(“文档”)样式对数据进行建模,例如,将特定用户的所有付款保存在用户自身内部的数组中。我需要规范化的数据谢谢。这个只有两个过滤器,看起来又大又乱。如果我有10个过滤器,如在现实世界中过滤类别,例如用户国家等,查询将像1000行长。以sql为例,它更简单、更有效。我需要规范化的数据,我不需要在付款表id中推送的所有内容都不可缩放。任何附加的筛选部分都将位于$expr下。Mongodb使用JSON查询语言,因此语法无法与SQL进行比较。与SQL不同,MongoDB还在聚合中使用多个阶段。