【问题标题】:How to query multiple collections in mongodb (without using $lookup)?如何在 mongodb 中查询多个集合(不使用 $lookup)?
【发布时间】:2019-09-04 01:06:55
【问题描述】:

我想创建一个查询,通过提供一个查询参数从三个不同的集合中获取数据。我见过使用$lookup 的方法,但我不想将其用作I cannot use it on sharded collections.

这里有一个例子来进一步解释。

我有三个集合:用户、聊天室和聊天消息。

用户集合:

{
    _id: ObjectId('456'),
    username: 'John',
    contacts: [
        {
            _id: ObjectId('AB12'),
            name: 'Mary',
            idOfContact: ObjectId('123'),
        },
        {
            _id: ObjectId('AB34'),
            name: 'Jane',
            _idOfContact: ObjectId('234'),
        },
        {
            _id: ObjectId('AB56'),
            name: 'Peter',
            _idOfContact: ObjectId('345'),
        }
    ],
}

聊天室集合:

{
    _id: ObjectId('AB34'),
    usersInThisChatRoom: [
        ObjectId("456"),
        ObjectId("123"),
        ObjectId("234"),
    ]
}

chatMessage 集合:

[
    {
        _id: ObjectId("M01"),
        chatRoomObjectId: _id: ObjectId('AB34'),
        senderObjectId: ObjectId('456'),
        message: 'Hello humans!',
        date: ISODate("2019-09-03T07:24:28.742Z"),
    },
    ...(other messages)
]

我想退货

[
    {
        chatRoomObjectId: ObjectId('AB34'),
        usersInThisChatRoom: [
            {
                contactName: 'John',
                contactUserId: ObjectId('456'),
            },
                contactName: 'Mary',
                contactUserId: ObjectId('123'),
            },
                contactName: 'Jane',
                contactUserId: ObjectId('234'),
            }
        ]
        chatMessages: [
            {
                _id: ObjectId("M01"),
                senderObjectId: ObjectId('456'),
                message: 'Hello humans!',
                date: ISODate("2019-09-03T07:24:28.742Z"),
            },
            ...(other messages)
         ]
    },  
    ...(other documents)
]

有没有办法通过使用user._id 进行单个查询来获得我想要的结果,这对性能是否友好?

或者,我是否必须一个接一个地进行多个查询才能实现我想要的?

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    根据this answer,您不能跨多个集合执行单个查询(除了 $lookup 聚合管道函数。

    这意味着您要么使用 $lookup 聚合管道,要么对数据库进行多次查询。

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2019-01-28
      • 2019-05-09
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多