为了账号安全,请及时绑定邮箱和手机立即绑定

使用$ lookup运算符的多个联接条件

使用$ lookup运算符的多个联接条件

HUH函数 2019-09-24 16:50:53
这是我的收藏:collection1:{    user1: 1,    user2: 2,    percent: 0.56}collection2:{    user1: 1,    user2: 2,    percent: 0.3}我想通过“ user1”和“ user2”加入两个集合。结果如下:{    user1: 1,    user2: 2,    percent1: 0.56,    percent2: 0.3}如何编写管道?
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

如果您想对数据建模,并且在决定这样做之前来这里检查mongodb是否可以对多个字段执行联接,请继续阅读。


尽管MongoDB可以执行联接,但是您也可以根据应用程序访问模式自由地对数据建模。如果数据与问题中显示的一样简单,我们可以简单地维护一个如下所示的单个集合:


{

    user1: 1,

    user2: 2,

    percent1: 0.56,

    percent2: 0.3

}

现在,您可以对本集合执行所有操作,而这些操作本来可以加入的。我们为什么要避免加入?由于分片集合(docs)不支持它们,这将阻止您在需要时进行横向扩展。规范化数据(具有单独的表/集合)在SQL中效果很好,但是在Mongo中,避免联接可以带来很多好处,而在大多数情况下不会产生任何后果。仅当您别无选择时,才在MongoDB中使用规范化。从文档:


通常,使用规范化的数据模型:


嵌入时将导致数据重复,但无法提供足够的读取性能优势,无法胜过重复的影响。

代表更复杂的多对多关系。

为大型分层数据集建模。

检查此处以了解有关嵌入的更多信息以及为什么要选择它而不是标准化。


查看完整回答
反对 回复 2019-09-24
?
呼如林

TA贡献1798条经验 获得超3个赞

您可以使用$ match和$ project管道进行多个字段匹配。(请参阅此处的详细答案-mongoDB在多个字段上联接)


db.collection1.aggregate([

                    {"$lookup": {

                    "from": "collection2",

                    "localField": "user1",

                    "foreignField": "user1",

                    "as": "c2"

                    }},

                    {"$unwind": "$c2"},


                    {"$project": {

                    "user2Eq": {"$eq": ["$user2", "$c2.user2"]},

                    "user1": 1, "user2": 1, 

                    "percent1": "$percent", "percent2": "$c2.percent"

                    }},


                    {"$match": {

                    {"user2Eq": {"$eq": True}}

                    }},


                    {"$project": {

                    "user2Eq": 0

                    }}


                    ])


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 1437 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信