首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
V2EX  ›  MongoDB

MongoDB 如何在对象中进行联合查询?

  •  
  •   leven87 · 136 天前 · 6615 次点击
    这是一个创建于 136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用 apollo server 通过 mongoose 连接 mongodb 进行后台开发。 现在遇到了一个问题,一个 collection Components 的结构为:

    Components {
    	coreInformation {
        	reflowId: String
            type: String
            ...    
        }
    	flowInformation {
        	owner: String
            user: String
            ...
        }
    
    }
    

    另一个 collection Vessels 的结构为:

    Vessels	{
    	imo: String
    	name: String
    }
    
    

    在 Components.flowInformation.user 中存储的是 Vessels.imo, 现在前端是列表显示 components,需要得到 Vessels.name,在传统的数据库中,有联合查询,很容易搞定。 但是在 mongoDB 中没有,我看网上说可以用 Populate+ Ref 搞定,但是我的 user 是包在 flowInformation 这个对象中的,我没有看到相关的例子。请 V 友帮忙,该如何使用,或者有其它的办法。谢谢。

    PS:并不想把 name 作为冗余数据也放到 component 中,因为会改变原有 document 结构,改动太大。

    第 1 条附言  ·  136 天前

    看来这个帖子要自己结贴了, 使用 mongoose 中的 virtual populate 功能可以实现联合查询,方法就是在schma里面要配置一下外键,具体可以参考 https://mongoosejs.com/docs/populate.html#populate-virtuals, 记得要加上 { toJSON: { virtuals: true }, toObject: { virtuals: true }}, 否则同样出不来。

    我的schema代码:

    componentSchema.virtual("vessel", {
      ref: "MongoVessel", // The model to use
      localField: "flowInformation.user", // Find people where `localField`
      foreignField: "imo", // is equal to `foreignField`
      // If `justOne` is true, 'members' will be a single doc as opposed to
      // an array. `justOne` is false by default.
      justOne: false
    });
    
    
    6 回复  |  直到 2019-07-24 08:35:51 +08:00
        1
    pifuant   136 天前
    mongo 不支持 join, 认命吧
        2
    jk1030   136 天前
    nosql
        3
    lqzhgood   136 天前 via Android   ♥ 1
    前几天刚碰到这个问题
    mongoose 的虚拟属性支持这个



    https://mongoosejs.com/docs/populate.html
    # Populate Virtuals
        4
    leven87   136 天前
    @lqzhgood 哈哈,感谢,想到一块了
        5
    bankroft   136 天前 via Android
    $lookup ?
        6
    ilucio   135 天前 via Android
    mongodb 4.0 后可以用 lookup 实现联合查询了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2340 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 12:55 · PVG 20:55 · LAX 04:55 · JFK 07:55
    ♥ Do have faith in what you're doing.