MongoDB $ nin otherDocument.array,无需下载otherDocument

时间:2017-12-30 07:54:38

标签: mongodb

我一直在争论一段时间,我必须从数据库中下载一个文档来构建我的查询,而且当我的服务开始获得越来越多的请求时,它真的会慢下来。我想知道是否有人可以帮助我优化查询,或者做到这一点,所以我不必下载初始文档。

我将在这里使用Tinder作为示例,因为它模拟了可能在此数组中的项目数量,以及为什么在每个客户端上使用“swipedBy:[]”数组来删除初始下载查询似乎效率低下,因为数组最终可能会长达数十万个元素,而且只会随着时间的推移而增长。

所以,假设我的用户文档中有一个名为“swipes”的字段,这是一个与他们交互过的用户的firebase id(字符串)数组,可以在下面找到一个示例:

{
    _id: 'firebaseUid,
    swipes: [ 'firebaseUid_1', 'firebaseUid_2', 'firebaseUid_3' ]
}

我有一个查询应该从数据库中选择一个尚未在MY滑动数组中的用户,目前这就是我完成它的方式。 (JavaScript)的

database.collection('users').findOne({ _id: myUserId }).then((document => {
    const query = {
        ...,
        $and: [
            { _id: { $ne: myUserId } },
            { _id: { $nin: document.swipes }
        ]
    }
});

这要求我从数据库中下载用户文档,然后将整个数组作为查询传回来,这在查询数十个(如果不是成千上万的数组元素)时似乎非常有用。

虽然上面的查询有效,但我觉得有一种方法可以加速,而我在MongoDB中缺乏知识实际上是在攻击我。我知道一个事实我可以在MySQL中做到这一点,但我不知道任何好的(和负担得起的)MySQL服务,如mLab。

我一直在争论一段时间,我必须从数据库中下载一个文档来构建我的查询,而且当我的服务开始获得越来越多的请求时,它真的会慢下来。我想知道是否有人可以帮助我优化查询,或者做到这一点,所以我不必下载初始文档。

我将在这里使用Tinder作为示例,因为它模拟了可能在此数组中的项目数量,以及为什么在每个客户端上使用“swipedBy:[]”数组来删除初始下载查询似乎效率低下,因为数组最终可能会长达数十万个元素,而且只会随着时间的推移而增长。

所以,假设我的用户文档中有一个名为“swipes”的字段,这是一个与他们交互过的用户的firebase id(字符串)数组,可以在下面找到一个示例:

{
    _id: 'firebaseUid,
    swipes: [ 'firebaseUid_1', 'firebaseUid_2', 'firebaseUid_3' ]
}

我有一个查询应该从数据库中选择一个尚未在MY滑动数组中的用户,目前这就是我完成它的方式。 (JavaScript)的

database.collection('users').findOne({ _id: myUserId }).then((document => {
    const query = {
        ...,
        $and: [
            { _id: { $ne: myUserId } },
            { _id: { $nin: document.swipes }
        ]
    }
});

这要求我从数据库中下载用户文档,然后将整个数组作为查询传回来,这在查询数十个(如果不是成千上万的数组元素)时似乎非常有用。

虽然上面的查询有效,但我觉得有一种方法可以加速,而我在MongoDB中缺乏知识实际上是在攻击我。我知道一个事实我可以在MySQL中做到这一点,但我不知道任何好的(和负担得起的)MySQL服务,如mLab。

我应该添加:我的MongoDB数据库是远程的,所以这个文档和大规模数组正在被下载(按请求)到我的Google Cloud Functions调用,然后被发送回服务器网络。这意味着必须下载数据然后再通过网络上传,并且考虑到我的收费是毫秒,我想尽量减少这一点。

1 个答案:

答案 0 :(得分:1)

您应该将用户文档中的滑动重构为单独的集合,该集合指向刷过的用户和刷过的用户。此外,这将允许存储其他数据,如向左或向右滑动,时间戳等。