当前位置: 首页 > 知识库问答 >
问题:

连接后,蒙哥比在阿特拉斯集群上读取DBname.system.索引失败

慎旭尧
2023-03-14

我有一个Jhipster Spring启动项目。最近我从mlabs独立沙盒转移到Atlas集群沙盒M0 Free层副本集。它甚至工作了,我对它进行了一些数据库操作。但是现在由于某种原因出现了读取权限错误

Error creating bean with name 'mongobee' defined in class path resource [DatabaseConfiguration.class]: Invocation of init method failed; nested exception is com.mongodb.MongoQueryException: Query failed with error code 8000 and error message 'user is not allowed to do action [find] on [test.system.indexes]' on server ********-shard-00-01-mfwhq.mongodb.net:27017

你可以在这里看到完整的堆栈https://pastebin.com/kaxcr7VS

我搜索了高和低,我能找到的是M0层用户没有权限覆盖管理数据库,我没有这样做。

即使现在连接到 Mlabs DB 工作正常,但在 Atlas 数据库 M0 层上也存在此问题。

Mongo DB版本:3.4

JAR及其版本名称:“mongobee”,版本:“0.10”,名称:“mongo java驱动程序”,版本:“3.4.2”

@Neil Lunn我用来连接的userId是admin的,连接读写通过shell或Robo3T(mongo客户端)工作

共有3个答案

闻人鸿飞
2023-03-14
Caused by: java.lang.NoSuchMethodError: com.github.mongobee.dao.ChangeEntryIndexDao.<init>(Ljava/lang/String;)V
    at com.github.mongobee.dao.ChangeEntryDao.<init>(ChangeEntryDao.java:34)
    at com.github.mongobee.Mongobee.<init>(Mongobee.java:87)
    at com.xxx.proj.config.DatabaseConfiguration.mongobee(DatabaseConfiguration.java:62)
    at com.xxx.proj.config.DatabaseConfiguration$$EnhancerBySpringCGLIB$$4ae465a5.CGLIB$mongobee$1(<generated>)
    at com.xxx.proj.config.DatabaseConfiguration$$EnhancerBySpringCGLIB$$4ae465a5$$FastClassBySpringCGLIB$$f202afb.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)
    at com.xxx.proj.config.DatabaseConfiguration$$EnhancerBySpringCGLIB$$4ae465a5.mongobee(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
    ... 22 common frames omitted

jhipster 5必须使用不同的版本,因为我在实现上述代码时得到了它。看起来它期待一个不同的版本。

司寇旺
2023-03-14

今天早上遇到了这个问题。这里有一个快速而肮脏的猴子补丁来解决这个问题:

package com.github.mongobee.dao;

import com.github.mongobee.changeset.ChangeEntry;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;

import java.util.List;

import static com.github.mongobee.changeset.ChangeEntry.CHANGELOG_COLLECTION;

public class ChangeEntryIndexDao {

    public void createRequiredUniqueIndex(DBCollection collection) {
        collection.createIndex(new BasicDBObject()
                        .append(ChangeEntry.KEY_CHANGEID, 1)
                        .append(ChangeEntry.KEY_AUTHOR, 1),
                new BasicDBObject().append("unique", true));
    }

    public DBObject findRequiredChangeAndAuthorIndex(DB db) {
        DBCollection changelogCollection = db.getCollection(CHANGELOG_COLLECTION);
        List<DBObject> indexes = changelogCollection.getIndexInfo();
        if (indexes == null) return null;
        for (DBObject index : indexes) {
            BasicDBObject indexKeys = ((BasicDBObject) index.get("key"));
            if (indexKeys != null && (indexKeys.get(ChangeEntry.KEY_CHANGEID) != null && indexKeys.get(ChangeEntry.KEY_AUTHOR) != null)) {
                return index;
            }
        }
        return null;
    }

    public boolean isUnique(DBObject index) {
        Object unique = index.get("unique");
        if (unique != null && unique instanceof Boolean) {
            return (Boolean) unique;
        } else {
            return false;
        }
    }

    public void dropIndex(DBCollection collection, DBObject index) {
        collection.dropIndex(index.get("name").toString());
    }

}
谷梁玺
2023-03-14

与MongoDB支持团队讨论后,MongoDB 3.0反对直接访问系统。索引集合,以前用于列出数据库中的所有索引。应用程序应该使用<code>db。

从MongoDB Atlas文档可以看出,它们可能禁止调用<code>系统 集合:

(可选)对于读写角色,还可以指定集合。如果未为读和读写指定集合,则该角色将应用于数据库中的所有集合(不包括某些system.collections)。

从stacktrace可以看出,MongoBee正在尝试进行这个调用,所以现在是库的问题,应该进行更新。

更新:为了在MongoBee发布新版本之前解决问题:

  1. 获取MongoBee<code>git克隆的最新来源git@github.com答:蒙哥比/蒙哥比。git,cd mongobee
  2. 获取拉取请求<code>git获取原始拉取/87/head:mongobee atlas
  3. 结账git结账mongobee atlas
  4. 安装MongoBee.jarmvn.clean安装
  5. /target文件夹或本地/获取编译的jar。m2
  6. 将jar用作项目的依赖项
 类似资料:
  • 我正在尝试连接到本地MongoDB实例(版本3.2)。我已经在构建中指定了依赖项。格拉德尔是这样的: 依赖项{编译'org.mongodb: mongoDB驱动程序: 3.3.0'} 我有一个简单的App.java文件,其中包含以下代码(见下文)。构建/编译Java步骤都运行良好,没有错误。但是当我运行代码时,我得到:“线程”主要“java.lang.noClassDefFoundEror中的异常

  • 根据Spring Cloud Kubernetes文档,为了在RBAC发现服务/pods,启用了Kubernetes发行版: 您需要确保运行spring-cloud-kubernetes的pod能够访问Kubernetes API。对于您分配给部署/pod的任何服务帐户,您需要确保它具有正确的角色。例如,根据您所在的项目,您可以将< code >群集阅读器权限添加到您的默认服务帐户。 为了发现服务

  • 本文介绍了如何使用个人电脑(Linux 或 macOS 系统)在阿里云上部署 TiDB 集群。 环境需求 aliyun-cli >= 3.0.15 并且配置 aliyun-cli 注意: Access Key 需要具有操作相应资源的权限。 kubectl >= 1.12 helm >= 2.11.0 && < 3.0.0 && != 2.16.4 jq >= 1.6 terraform 0.12.