Mongodb $lookup 动态集合

Posted

技术标签:

【中文标题】Mongodb $lookup 动态集合【英文标题】:Mongodb $lookup dynamic collection 【发布时间】:2021-09-17 01:37:17 【问题描述】:

我有以下架构,其中项目类型可能会有所不同,并在 connections.kind 中提到。

var userSchema = new Schema(
  name: String,
  connections: [
    kind: String,
    item:  type: ObjectId, refPath: 'connections.kind' 
  ]
);

var organizationSchema = new Schema( name: String );

我正在尝试进行动态查找,以便填充项目对象。但这似乎不起作用。

db.users.aggregate([
    
        $lookup:
            from: '$connections.kind',
            localField: 'connections.item',
            foreignField: '_id',
            as: 'items'
        
    
])

我知道我可以用 mongoose.populate 做到这一点,但想知道 $lookup 是否有可能

【问题讨论】:

您可以使用填充 db.user.find().populate(path:"connections.item") from 将具有集合的名称。 【参考方案1】:

到目前为止,你不能。 from 字段不能是表达式,必须是字符串文字。但是,您可以在此处跟踪一个未解决的问题,这似乎正是您所需要的:https://jira.mongodb.org/browse/SERVER-22497。

【讨论】:

那么,除了使用 $Lookup 的 from 子句之外,应该有什么方法来提供存在于不同数据库中的集合名称? Fromclause 需要一个 str 而不是集合的引用,例如 var readDocs = new Mongo("mongodb://MongoR:<PWD>@<Server_name>:27017").getDB("<dbname>").collection_name

以上是关于Mongodb $lookup 动态集合的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 的 $lookup 函数中使用字段值

如何在 mongodb 中使用 $lookup 加入多个集合

使用聚合 $lookup 加入 mongodb

Mongo 如何使用 DBRef 进行 $lookup

具有多个 $match 或 $pipeline 条件的 Mongo $lookup

除了 $lookup 运算符之外,MongoDB 4.0 中加入的替代方法是啥,因为它不适用于分片集合