我有 2 个虚拟机,两个虚拟机上都运行着 mongodb。我已经创建了用户和角色并添加了用于测试的数据。一切正常,直到我尝试设置副本集。当我运行 rs.initiate() 时,出现“...replSetHeartbeat 需要身份验证...”错误,如下所示。我可以通过传递 --host "nodeserver-hulk:27017 手动从 "hawkeye" 连接到 "hulk" 服务器。有什么想法吗?
系统
Ubuntu Server 18.04.4 LTS
Mongod v.4.2.3
Run Code Online (Sandbox Code Playgroud)
rs.启动命令
rs.initiate(
{
_id: "r1",
version: 1,
members: [
{ _id: 0, host : "nodeserver-hulk:27017"},
{ _id: 1, host : "nodeserver-hawkeye:27017"}
]
}
)
Run Code Online (Sandbox Code Playgroud)
rs.启动错误
{
"ok" : 0,
"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: nodeserver-hawkeye:27017 failed with command replSetHeartbeat requires authentication",
"code" : 74,
"codeName" : "NodeNotFound"
}
Run Code Online (Sandbox Code Playgroud)
mongod.conf 文件(两台服务器相同) …
是否可以选择MongoDB在mongorc.js中启动时应使用的数据库?
use dbname
Run Code Online (Sandbox Code Playgroud)
没有运作.这是一个非JavaScript宏.
如何在mongodb shell中使用变量作为字段名称的一部分?我正在尝试执行以下操作:
> var site = "google.com";
> var y = 10;
> var m = 5;
// This fails (field names as concatenation):
> db.test.update({ "domain" : site},
{ $inc : {"counts.year."+y : 1, "counts.month."+m : 1}}, upsert=true);
> Thu Apr 19 19:12:56 SyntaxError: missing : after property id (shell):1
// This works:
> db.test.update({ "domain" : site}, { $inc : {"counts.year.10" : 1,
"counts.month.5" : 1}}, upsert=true);
Run Code Online (Sandbox Code Playgroud)
我想问题就在于JS对象的创建方式:例如var t = 10; doc = {t : 0};有效 …
我有一个名为Profiles的集合,其中包含一个名为emails的数组.
我想将数组中的所有电子邮件字符串更改为小写.
db.Profiles.update({"emails":/@/i}, {$set: {"emails" : emails.toLowerCase()}}})
Run Code Online (Sandbox Code Playgroud)
错误:
Tue Jan 29 16:52:28 SyntaxError:missing)在参数列表(shell)之后:1
我也发现了这个:
db.Profiles.find().forEach(
function(e) {
e.emails = e.emails.toLowerCase();
db.Profiles.save(e);
}
)
Run Code Online (Sandbox Code Playgroud)
错误:
Tue Jan 29 16:51:41 TypeError:e.emails.toLowerCase不是函数(shell):3
在此先感谢您的帮助.
我想在mongo shell中创建一个新的ObjectId但是在过去的Date中创建一个新的ObjectId,以便在过去模拟该文档的创建.这与ObjectId 的getTimestamp()函数相反(即给出一个时间戳,获取一个在调用时返回该时间戳的ObjectId getTimestamp)
任何想法如何做到这一点?
我在Mongo Shell中写了以下4个语句
一世) NumberLong(3)
II) NumberLong(3)+NumberLong(4)
三) typeof NumberLong(3)
IV) typeof (NumberLong(3)+NumberLong(4))
和他们相应的产出是
一世) NumberLong(3)
II) 7
三) object
IV) number
虽然第二个结果使第四个结果显而易见,但我无法找到这个行为的头部或尾部.幕后发生了什么?我尝试在MongoDB文档中找到基础概念,但找不到多少.请帮忙!!
mongo代码:
db.temperature.insert({“ x”:3,“ y”:4});
db.temperature.find();
输出 {“ _id”:ObjectId(“ 52b418fb132c1f3236831447”),“ y”:4,4,“ x”:3}
请帮助我理解为什么在我的情况下(上)。即使插入顺序不同,find方法也会先显示Y值,然后再显示x值。
感谢任何帮助。
如何在MongoShell中实现以下SQL?
Select TableA.* from TableA where TableA.FieldB in (select TableB.FieldValue from TableB)
Run Code Online (Sandbox Code Playgroud)
Mongo doc给出了一些例子
db.inventory.find( { qty: { $in: [ 5, 15 ] } } )
Run Code Online (Sandbox Code Playgroud)
我希望该数组是从另一个查询动态的.可能吗?
扩展我的问题
我有一个bot名字的集合
机器人收藏
{
"_id" : ObjectId("53266697c294991f57c36e42"),
"name" : "teoma"
}
Run Code Online (Sandbox Code Playgroud)
我有一个用户流量的集合,在该流量集合中,我有一个字段 useragent
userTraffic集合
{
"_id" : ObjectId("5325ee6efb91c0161cbe7b2c"),
"hosttype" : "http",
"useragent" : "Mediapartners-Google",
"is_crawler" : false,
"City" : "Mountain View",
"State" : "CA",
"Country" : "United States"
}
Run Code Online (Sandbox Code Playgroud)
我想选择其中useragent包含任何bot集合名称的所有用户流量文档
这就是我想出的
var botArray = db.bots.find({},{name:1, _id:0}).toArray()
db.Sessions.find({ …Run Code Online (Sandbox Code Playgroud) 我有一个非常庞大的mongo聚合命令.
db.container_product.aggregate([
{"$unwind":"$product"},
{"$group":{"_id":"$product","container_ids":{"$push":"$container_id"}}}
])
Run Code Online (Sandbox Code Playgroud)
它产生了近5k组,但它们都是普通的整数.例如:
{
"_id" : NumberInt(107058402),
"container_ids" : [
NumberInt(107058409),
NumberInt(107058410),
NumberInt(107058411),
NumberInt(107058412),
NumberInt(107058413)
]
}
Run Code Online (Sandbox Code Playgroud)
当我在shell(普通shell,还有Robomongo等)中运行它时它工作得很好.但是当我尝试从PHP运行它时,它给了我16MB的错误.
172.16.0.2:27017: exception: aggregation result exceeds maximum document size (16MB)
在这种情况下,PHP和shell之间的巨大差异是什么?
我怎么解决这个问题?
我有一个NumberDecimal类型为“test”的文档
{ "_id" : ObjectId("5d1a202e476381c30cd995a4"), "test" : NumberDecimal("0.1") }
Run Code Online (Sandbox Code Playgroud)
如何“检测”字段从转换NumberDecimal到DoubleMongoDB中的壳呢?
我试过执行
db.collection.find({"test": {$exists: true}}).forEach(function (x) { x.test = parseFloat(x.test); db.collection.save(x); });
Run Code Online (Sandbox Code Playgroud)
但不要解决这个问题,因为它返回 NaN
mongo-shell ×10
mongodb ×10
javascript ×2
bigdecimal ×1
decimal ×1
nosql ×1
php ×1
replication ×1