我的理解是使用upsert更新:对单个文档执行true是一个原子操作,因此当集合没有唯一的索引字段时,这应该永远不会导致重复键错误,特别是不会出现在主_id键上:
Order.update({ _id: order._id }, query, { upsert: true }, cb) // with mongoose
Run Code Online (Sandbox Code Playgroud)
但这出现在mongod.log中:
2015-03-27T09:39:10.349-0400 I WRITE [conn258236] update xyz.orders
query: { _id: "6353f880-c6a7-4260-809f-98e0af27b9a2" } update: { $set: { ...
} keyUpdates:0 writeConflicts:0 **exception: E11000 duplicate key error dup
key: { : "6353f880-c6a7-4260-809f-98e0af27b9a2" } code:11000** numYields:1
locks:{} 138ms
2015-03-27T09:39:10.349-0400 I COMMAND [conn258236] command xyz.$cmd
command: update { update: "orders", writeConcern: { w: 1 }, ordered: true,
updates: [ { q: { _id: "6353f880-c6a7-4260-809f-98e0af27b9a2" }, u: { $set: {
... …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 ubuntu 16.04 上启动 mongodb 4.0.4,但数据库拒绝了我的所有尝试。我检查了 mongodb 日志文件,发现名为 WiredTiger.turtle 的文件没有所需的权限。这里记录错误:
2018-11-26T15:14:32.438+0600 E STORAGE [initandlisten] WiredTiger error (13) [1543223672:438144][32673:0x7fee423e3a40], wiredtiger_open: __posix_open_file, 715: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied Raw: [1543223672:438144][32673:0x7fee423e3a40], wiredtiger_open: __posix_open_file, 715: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied
2018-11-26T15:14:32.438+0600 E STORAGE [initandlisten] WiredTiger error (13) [1543223672:438429][32673:0x7fee423e3a40], wiredtiger_open: __posix_open_file, 715: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied Raw: [1543223672:438429][32673:0x7fee423e3a40], wiredtiger_open: __posix_open_file, 715: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied
2018-11-26T15:14:32.438+0600 E STORAGE [initandlisten] WiredTiger error (13) [1543223672:438594][32673:0x7fee423e3a40], wiredtiger_open: __posix_open_file, 715: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied Raw: [1543223672:438594][32673:0x7fee423e3a40], …Run Code Online (Sandbox Code Playgroud) 这听起来很奇怪,我希望我做错了什么,但是我的MongoDB收藏品正在收集我的收藏中Count的一个.
我有一个(我相信)359671文件的集合.但是,该count()命令返回359670个文档.
我正在count()使用mongo shell 执行命令:
rs0:PRIMARY> db.COLLECTION.count()
359670
Run Code Online (Sandbox Code Playgroud)
这是不正确的.
它没有找到我的收藏中的每一个文件.
如果我提供以下查询来计数,我得到正确的结果:
rs0:PRIMARY> db.COLLECTION.count({_id: {$exists: true}})
359671
Run Code Online (Sandbox Code Playgroud)
我相信这是WiredTiger中的一个错误.据我所知,每个文档都有相同的定义,一个整数的_id字段,范围从0到359670,以及一个BinData字段.我没有旧版存储引擎(或Mongo 2,这可能导致问题)的问题.
这是我做错了吗?我不想使用{_id: {$exists: true}}查询,因为完成需要100倍的时间.
我使用带有WiredTiger存储引擎的MongoDB 3.0.当我在dbPath中检查我的Mongo文件时,我看到了文件的名称,格式如下:collection-0--4989330656807016483.wt collection-2--4989330656807016483.wt collection-4--4989330656807016483.wt...我怎么知道这些文件名和真实集合的名称之间的关系,除了数据大小的方式?
在副本模式下,对任何DB中的任何集合的每个写操作也会写入oplog集合.
现在,当并行写入多个DB时,所有这些写操作也会写入oplog.我的问题:这些写操作是否需要锁定oplog?(我正在使用w:1写关注).如果他们这样做,这有点类似于对所有不同DB的所有写操作之间的全局锁定,不是吗?
我很乐意得到任何暗示.
我尝试在mongodb中设置wiredTiger的缓存大小限制。首先,我执行了以下命令:
mongod --wiredTigerCacheSizeGB 1
Run Code Online (Sandbox Code Playgroud)
我还将以下几行添加到名为 mongod.conf.orig 的配置文件中
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
wiredTiger:
engineConfig:
cacheSizeGB: 1
Run Code Online (Sandbox Code Playgroud)
然后执行命令:
mongod --config /etc/mongod.conf
Run Code Online (Sandbox Code Playgroud)
为了仔细检查我的更改,我想显示有线老虎当前使用的缓存大小。
有可能显示吗?
我正在使用Java驱动程序,虽然这个问题不是特定于语言的,但是要编写对mongodb文档的部分更新,因为使用MMAPv1存储引擎可以在适当的位置编辑文档(在内存中),这样可以提供更好的性能.这确实增加了相当大的开发复杂性,因为我可以立即保存整个文档,而不用担心确切更新的细节.在更新到WiredTiger之后,我了解到这个较新的存储引擎不会编辑文档(在内存中),而是为每次写入分配新的内存(不清楚这是否意味着文档的完整副本或只是差异).这是否意味着无论是完整文档写入还是部分文档写入,它都没有性能差异?
我在 Windows 10 下使用 docker-compose 像这样:
version: '3'
services:
mongo:
image: mongo:4.2
ports:
- "27017:27017"
restart: always
volumes:
- type: bind
source: ${PWD}/mongod.conf
target: /etc/mongod.conf
entrypoint: ["mongod", "--bind_ip_all", "--config", "/etc/mongod.conf"]
Run Code Online (Sandbox Code Playgroud)
我的 mongod.conf:
storage:
wiredTiger:
collectionConfig:
blockCompressor: zstd
configString: "allocation_size=64KB,internal_page_max=64KB,leaf_page_max=64KB"
Run Code Online (Sandbox Code Playgroud)
当我docker exec docker_mongo_1 df使用和不使用 zstd时,我仍然使用相同的磁盘大小。使用 zstd:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 65792556 49263808 13156972 79% /data/db
Run Code Online (Sandbox Code Playgroud)
没有:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 65792556 47991952 14428828 77% /data/db
Run Code Online (Sandbox Code Playgroud)
(轻微的变化是由于插入数据的随机性,但文档的数量和它们的大小在彼此的百分之几以内。)我使用 mongodump 从 snappy 和 mongorestore …
我正在将辅助副本集成员升级到wiredTiger.我已将它从MongoDB 2.6.3升级到3.0.4并将存储引擎更改为wiredTiger.现在它正在重新同步主数据库中的所有数据.在某些时候收到以下错误,并且该过程重新开始:
2015-07-22T13:18:55.658 + 0000 I INDEX [rsSync]使用批量方法构建索引
2015-07-22T13:18:55.664 + 0000我完成了INDEX [rsSync]构建索引.共扫描了1591条记录.0秒
2015-07-22T13:18:56.397 + 0000 E STORAGE [rsSync] WiredTiger(24)[1437571136:397083] [20413:0x7f3d9ed29700],file:WiredTiger.wt,session.create:WiredTiger.turtle:fopen:打开太多档
2015-07-22T13:18:56.463 + 0000 E REPL [rsSync] 8 24:打开文件太多
2015-07-22T13:18:56.463 + 0000 E REPL [rsSync]初始同步尝试失败,剩余9次尝试
同一台机器之前运行的是2.6.3版本,没有任何打开文件限制问题.我知道wiredTiger可能会创建更多的文件,所以它必须是它,但它是否会同时打开它们?
以供参考:
cat/proc/sys/fs/file-max
10747371
在/etc/init.d/mongod中配置为:
ulimit -n 64000
根据文档,似乎mongo为每个数据文件保存文件描述符.与在wiredTiger中一样,这导致每个集合的文件+每个索引的文件,根据我们的用例计算,可以加起来超过700K.
所以我可以将ulimit更改为700000或更高,但我想知道这是否是最正确的解决方案,以及存在哪些替代方案.
我注意到在看似相同的总体上存在巨大的性能差异,至少在概念上是这样。测试是在一个简单的集合结构上进行的,该结构有一个 _id、一个名称和一个createdAt,但其中有 2000 万个。在createdAt上有一个索引。它托管在 mlab 集群上,版本为 3.6.9 WiredTiger。
我正在尝试使用聚合进行简单的分页,我知道我可以使用查找和限制,但我喜欢向管道添加更多元素,我给出的示例非常精炼。
db.getCollection("runnablecalls").aggregate([
{
$facet: {
docs: [
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{ $skip: 0 },
],
page_info: [
{ $group: { _id: null, total: { $sum: 1 } }
}
],
}
}
])
Run Code Online (Sandbox Code Playgroud)
这几乎需要40s. 现在,如果我将$sort和移到$limit刻面之外,则需要0.042s.
db.getCollection("runnablecalls").aggregate([
{ $sort: {createdAt: -1} },
{ $limit: 25 },
{
$facet: {
docs: [
{ $skip: 0 },
],
page_info: [
{ …Run Code Online (Sandbox Code Playgroud) mongodb ×10
wiredtiger ×10
database ×1
docker ×1
mongodb4.0 ×1
performance ×1
replicaset ×1
replication ×1
ubuntu-16.04 ×1
zstd ×1