MongoError:无法对atlas中的admin进行查询

时间:2018-02-28 06:48:02

标签: mongodb mongoose

我刚刚在Atlas上设置了一个免费的MongoDB。我添加了一个名为' react-project'我试图连接到使用mongoose。这是我的连接字符串:

public enum LoginStatus {

LOGGEDIN("LOGGEDIN", "Loggedin"),

LOGOUT("LOGOUT", "Logout");

private final String value;
private final String description;

LoginStatus(String value, String description) {
    this.value = value;
    this.description = description;
}


public String value() {
    return this.value;
}


public String getReasonPhrase() {
    return this.description;
}

@Override
public String toString() {
    return this.value;
}
}

如您所见,在查询结束时,我指定了要连接的数据库。我可以很好地连接到mongodb实例,但是当我尝试做一个操作(比如Model.find())时,我得到以下MongoError:

mongoose.connect('mongodb+srv://myUser:myPassword@myCluster.mongodb.net/react-project');

这让我相信它没有连接到' react-project'数据库,但正在连接到' admin'而不是数据库。

为什么会发生这种情况?如何连接到正确的数据库?

以下是我正在运行的代码,它给出了错误:

MongoError: cannot do raw queries on admin in atlas

10 个答案:

答案 0 :(得分:5)

我有完全相同的问题。看起来像是一个新的。

继承我现在有效的连接字符串

mongoose.connect('的mongodb:// <强> USERNAME 密码 @ myShard -shard-00-00-lbofd.mongodb.net :27017, myShard -shard-00-01-lbofd.mongodb.net:27017, myShard -shard-00-02-lbofd.mongodb.net:27017/ <强> MYDBNAME SSL =真安培; replicaSet = myShard -shard-0安培; authSource =管理员);

要创建新数据库,我使用了MongoDB Compass。从Atlas站点复制连接字符串(较长的一个 - 我认为是3.4),当你打开mongodb罗盘时,它会识别出你的剪贴板(OSX)中有一个连接字符串,并允许你用一个填充Compass的连接。简单点击。您可以从那里创建一个新数据库(单击左上角的MyCluster - 然后创建数据库。将新数据库的名称放在我的连接字符串中的粗体MYDBNAME中。

确实需要刷新才能看到新数据。

我和你有很多相同的连接字符串(db name / shard不同等) - 我能够POST而不是GET。 POSTS没有创建错误(但我找不到我发布的数据)并且GET抛出了相同的错误。

答案 1 :(得分:4)

遇到同样的问题。
将连接字符串更改为 3.4版本(较长的一个而不是3.6)有帮助。
奇怪的是,在问题出现之前,它在3.6上运行良好。

答案 2 :(得分:2)

遇到相同的问题,以上方法均无济于事。自从此页面成为Google的首个热门网站以来,记录下我的解决方案。

如果您像以前一样使用connect-mongo库,则可以使用旧的连接字符串(Node 2.2而不是Node 3.0)来修复它。要在Atlas中实现该功能,请在群集上单击->连接->连接您的应用程序->在驱动程序下,选择节点v。2.2,然后复制该连接字符串。

这是因为connect-mongo无法处理较新字符串中的“ + srv”。

因此该字符串应类似于 MongoDB://<user>:<password>@cluster0-shard-00-00-rnmsm.mongodb.net:27017,cluster0-shard-00-01-rnmsm.mongodb.net:27017,cluster0-shard-00-02-rnmsm.mongodb.net:27017/test?ssl=true&replicaSet=cluster0-shard-0&authSource=admin&retryWrites=true&w=majority

答案 3 :(得分:2)

尝试从付费的Mongo Atlas集群切换回我的免费集群后,我刚收到此错误。对我来说,解决方案最终变得非常简单:

在URI中,我将/admin更改为空闲集群的数据库的名称,或者将/test更改为我的情况。

修复前的字符串:

"mongoURI": "mongodb+srv://<username>:<password>@cluster0-azhuz.mongodb.net/admin?retryWrites=true&w=majority"

修复后的字符串:

"mongoURI": "mongodb+srv://<username>:<password>@cluster0-azhuz.mongodb.net/test?retryWrites=true&w=majority"

答案 4 :(得分:1)

我使用无服务器框架和AWS Lambda遇到了这个问题。我的问题是环境变量没有用我的deploy命令进行更新,并且它使用的是我的Atlas连接字符串的旧版本,并且用户使用了不正确的权限。

因此,虽然这是我的错误的一个特定发生,但对于其他遇到此错误的用户而言,似乎也可能只是该用户的权限问题。

答案 5 :(得分:1)

我知道现在回答这个问题真的很晚,但是我遇到了同样的问题,我只是将 Mongodb用户名放在'/'之后,现在我的连接字符串看起来像mongodb+srv://UddeshRW:uddesh@cluster0-2erky.mongodb.net/<Mongodb user name>

答案 6 :(得分:0)

请确保您遵循此步骤。 (我的 node 版本v10.15.0, mongodb罗盘版本1.16.3(1.16.3))

  1. 确保您的用户拥有readWriteAnyDatabase@admin的权限
  2. 然后复制 class HomeFragment : androidx.fragment.app.Fragment() { lateinit var mContext : Context lateinit var mActivity : FragmentActivity lateinit var recyclerView1 : RecyclerView lateinit var fragmentView : View private var firstProducts = listOf<Product>() lateinit var firstProductAdapter : ProductListAdapter override fun onAttach(context: Context) { super.onAttach(context) mContext = context activity?.let { mActivity = it } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // set up view fragmentView = inflater.inflate(R.layout.fragment_home, container, false) recyclerView1 = fragmentView.findViewById(R.id.recyclerView_1) return fragmentView } override fun onResume() { super.onResume() if (lastTimeFetchDataIsMoreThan10MinutesAgo) { getProducts() // when I open the app for the very first time, I fetch the product data } else { // when it is more than 10 minutes, do nothing } } override fun onStop() { super.onStop() progressBar.visibility = View.INVISIBLE // to ensure the progress bar will always dissapear if move to another destination } private fun getProducts(type: String) { showProgressBar(true) Product.getProductsFromServer(customerID = userData.id.toString(), type = type) { errorMessage, products -> errorMessage?.let { activity?.toast(it) } ?: run { val productList = products ?: ArrayList() setUpRecyclerView(type = type,products = productList) } } showProgressBar(false) } private fun setUpRecyclerView(type: String, products: List<Product>) { val productAdapter = ProductListAdapter(context = mContext,products = products) val layoutManager = LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false) if (type == "special") { firstProductAdapter = productAdapter firstProducts = products recyclerView1.adapter = productAdapter recyclerView1.layoutManager = layoutManager recyclerView1.setHasFixedSize(true) } } private fun showProgressBar(enable: Boolean) { if (enable) { progressBar.visibility = View.VISIBLE recyclerView1.visibility = View.GONE selectedProductTextView.visibility = View.GONE bestSellingProductTextView.visibility = View.GONE } else { progressBar.visibility = View.GONE recyclerView1.visibility = View.VISIBLE selectedProductTextView.visibility = View.VISIBLE bestSellingProductTextView.visibility = View.VISIBLE } } }

  3. 在打开mongoDB复制后,Compass将显示alert prop like this,然后单击“连接”按钮

  4. 登录create the new database
  5. 。在这种情况下,我已经创建的数据库名为 devconnector

  6. 然后在您的app中(在本例中,我的应用使用的是 Nodejs ),并确保在URL mongodb+srv://<yourUsername>:<yourPassword>@devconnector-xszss.mongodb.net/admin中(对于本例而言)刚创建的是 devconnector 。确保不是 admin

  7. 然后您可以制作一个post request(my post request code)my UserSchema

我希望这会对您有所帮助。

答案 7 :(得分:0)

我在另一个网站上找到了一个非常简单的解决方案,但决定在这里分享!

基本上,将连接字符串中的/admin替换为MongoDB Atlas中集群的名称。

答案 8 :(得分:0)

我也遇到了同样的问题。只需在MongoURL中将 / admin 更改为您的集群名称。 例: mongodb + srv:// 用户名密码 @ cluster0-qkaef.mongodb.net / 集群名?retryWrites = true&w = majority

答案 9 :(得分:0)

我注意到您正在使用猫鼬。将头撞在墙上一个小时,直到我再次检查mongoose docs.

mongoose.connect('mongodb://localhost:27017/myapp', {useNewUrlParser: true});

.connect()方法具有第二个参数,用于指定将新的URL解析器用于mongo:)

希望这对某人(或我未来的自我)有所帮助!