如何在mongodb中查询多个集合(不使用$ lookup)?

时间:2019-09-03 16:05:52

标签: mongodb mongoose

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

这是一个进一步解释的例子。

我有三个集合:用户,聊天室和chatMessage。

用户集合:

{
    _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进行单个查询来获得期望的结果,这是否对性能友好?

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

1 个答案:

答案 0 :(得分:0)

根据this answer,您无法跨多个集合执行单个查询(除了$ lookup聚合管道功能之外。

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