我刚刚在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
答案 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))
然后复制
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
}
}
}
在打开mongoDB复制后,Compass将显示alert prop like this,然后单击“连接”按钮
。在这种情况下,我已经创建的数据库名为 devconnector 。
然后在您的app中(在本例中,我的应用使用的是 Nodejs ),并确保在URL mongodb+srv://<yourUsername>:<yourPassword>@devconnector-xszss.mongodb.net/admin
中(对于本例而言)刚创建的是 devconnector 。确保不是 admin
然后您可以制作一个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:)
希望这对某人(或我未来的自我)有所帮助!