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

这是我的收藏:


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

}

如何编写管道?


HUH函数
浏览 1448回答 3
3回答

红颜莎娜

如果您想对数据建模,并且在决定这样做之前来这里检查mongodb是否可以对多个字段执行联接,请继续阅读。尽管MongoDB可以执行联接,但是您也可以根据应用程序访问模式自由地对数据建模。如果数据与问题中显示的一样简单,我们可以简单地维护一个如下所示的单个集合:{    user1: 1,    user2: 2,    percent1: 0.56,    percent2: 0.3}现在,您可以对本集合执行所有操作,而这些操作本来可以加入的。我们为什么要避免加入?由于分片集合(docs)不支持它们,这将阻止您在需要时进行横向扩展。规范化数据(具有单独的表/集合)在SQL中效果很好,但是在Mongo中,避免联接可以带来很多好处,而在大多数情况下不会产生任何后果。仅当您别无选择时,才在MongoDB中使用规范化。从文档:通常,使用规范化的数据模型:嵌入时将导致数据重复,但无法提供足够的读取性能优势,无法胜过重复的影响。代表更复杂的多对多关系。为大型分层数据集建模。检查此处以了解有关嵌入的更多信息以及为什么要选择它而不是标准化。

呼如林

您可以使用$ 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                    }}                    ])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MongoDB