我有一个具有以下结构的mongodb集合term
{
"_id" : "00002c34-a4ca-42ee-b242-e9bab8e3a01f",
"terminologyClass" : "USER",
"code" : "X67",
"terminology" : "some term related notes",
"notes" : "some notes"
}
Run Code Online (Sandbox Code Playgroud)
和一个表示术语集合的java类 Term.java
@Document
public class Term{
@Id
protected String termId;
@Indexed
protected String terminologyClass;
@Indexed(unique=true)
protected String code;
@Indexed
protected String terminology;
protected String notes;
//getters & setters
}
Run Code Online (Sandbox Code Playgroud)
我term收藏了很多文件.现在我添加了一个新字段Term.javaas
@Indexed
protected String status;
Run Code Online (Sandbox Code Playgroud)
添加字段status后Term.java,在向term集合中插入新术语时,我得到了一个例外:
com.mongodb.MongoException:带名称的索引:代码已经存在,具有不同的选项
我使用的是MongoDB版本:2.6.5和spring-data-mongodb版本:1.3.2
我正在尝试重现索引交集指令的第一个示例(http://docs.mongodb.org/manual/core/index-intersection/)但面临一个问题:mongo不使用这两个索引
我的步骤:
添加索引:
db.orders.ensureIndex({ qty: 1 })
db.orders.ensureIndex({ item: 1 })
db.orders.getIndexes()
[{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.orders"
},
{
"v" : 1,
"key" : {
"qty" : 1
},
"name" : "qty_1",
"ns" : "test.orders"
},
{
"v" : 1,
"key" : {
"item" : 1
},
"name" : "item_1",
"ns" : "test.orders"
}]
Run Code Online (Sandbox Code Playgroud)检查查询说明:
db.orders.find( { item: "abc123", qty: …Run Code Online (Sandbox Code Playgroud)上次我从 MongoDB Atlas 收到警报时:
Disk I/O % utilization on Data Partition has gone above 70 on nvme2n1
Run Code Online (Sandbox Code Playgroud)
但我不知道如何本地化/查询/索引/部分代码/有问题的集合。
我可以通过什么方式进行任何分析以找出问题的根本原因?
mongodb database-performance mongodb-query mongodb-indexes mongodb-atlas
假设一个包含3个字段的假设文档:
现在,给定一个关于emailAddress和帐户的查询,以下两个索引中的哪一个将表现更好:
在稀疏索引文档中,我发现有关mongodb 3.2部分索引的注释
在3.2版中更改:从MongoDB 3.2开始,MongoDB提供了创建部分索引的选项.部分索引提供了稀疏索引功能的超集.如果您使用的是MongoDB 3.2或更高版本,则部分索引应优先于稀疏索引.
部分索引非常有用,我想在我的项目中使用它们.是否有可能与猫鼬一起使用?
我有一个名为MongoDB的集合post与3500万级的对象.该集合有两个二级索引,定义如下.
> db.post.getIndexKeys()
[
{
"_id" : 1
},
{
"namespace" : 1,
"domain" : 1,
"post_id" : 1
},
{
"namespace" : 1,
"post_time" : 1,
"tags" : 1 // this is an array field
}
]
Run Code Online (Sandbox Code Playgroud)
我希望以下查询,只需过滤namespace和post_time,在合理的时间内运行而不扫描所有对象.
>db.post.find({post_time: {"$gte" : ISODate("2013-04-09T00:00:00Z"), "$lt" : ISODate("2013-04-09T01:00:00Z")}, namespace: "my_namespace"}).count()
7408
Run Code Online (Sandbox Code Playgroud)
然而,MongoDB需要至少十分钟来检索结果,奇怪的是,它设法根据功能扫描7000万个对象来完成工作explain.
> db.post.find({post_time: {"$gte" : ISODate("2013-04-09T00:00:00Z"), "$lt" : ISODate("2013-04-09T01:00:00Z")}, namespace: "my_namespace"}).explain()
{
"cursor" : "BtreeCursor namespace_1_post_time_1_tags_1",
"isMultiKey" : true, …Run Code Online (Sandbox Code Playgroud) 我知道复合索引是这样定义的:
db.products.ensureIndex( { "item": 1, "stock": 1 } )
Run Code Online (Sandbox Code Playgroud)
并散列一个像这样的简单索引:
db.active.ensureIndex( { item: "hashed" } )
Run Code Online (Sandbox Code Playgroud)
问题是如何实现两者?
我目前正在尝试构建一个2dsphere索引,但创建似乎失败了.
索引创建失败的文档是有效的geojson(根据geojsonlint).
另据我所知,它遵循MongoDB"Polygon"规则.
我很感激任何帮助,因为我无法弄清楚为什么索引创建似乎失败了.
提前致谢!
db.poly.ensureIndex( { loc: "2dsphere" } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"ok" : 0,
"errmsg" : "Can't extract geo keys from object, malformed geometry?: { _
id: 353, loc: { type: \"Polygon\", coordinates: [ [ [ 8.090732000000001, 53.6379
766 ], [ 8.050639500000001, 53.6250853 ], [ 8.036974600000001, 53.6286108 ], [ 7
.994035500000001, 53.6016978 ], [ 8.0120927, 53.59855020000001 ], [ 8.0102720000
00001, 53.5883803 ], [ 8.023379, 53.5867745 ], [ 8.0148004, 53.5832729 ], [ 8.02
6839500000001, …Run Code Online (Sandbox Code Playgroud) 如何使用Meteor获取集合上的索引列表?
类似于(或者可能基于代理)Mongo的
东西在Meteor中还没有太多的索引API(最终会有一个); 但我希望有人已经解决了这个问题
干杯db.collection.getIndexes
我想完成一项特殊的任务,但我没有找到任何特定的方法来做到这一点.假设我有一个用于发送邮件的应用程序.我在mongo的一个集合中记录了这些邮件.使用这个应用程序,我现在可以发送邮件或可以安排邮件将来.集合中的文档结构如下:
{
'_id' : 123456789,
'to_email' : 'xyz@gmail.com'
'from_email' : 'abc@gmail.com'
'subject': 'some subject'
'type' : '<1 if normal and 2 if scheduled>',
'createdDate' '<date when mail was sent or the request was created>',
'scheduledDate' : '<time for which mail is scheduled>'
.. and many more key-value pairs
}
Run Code Online (Sandbox Code Playgroud)
scheduledDate字段可以是零或任何日期,具体取决于是否已计划.我不想保留超过2天的数据,所以我在'createdDate'上创建了一个TTL索引,为期2天.但我也不想删除将来安排的行或请求.我正在寻找某种条件TTL,但无法找到任何这样的解决方案.
是否有任何可用的条件TTL或任何其他方式在mongodb中做到这一点.
我想创建一个TTL,其工作方式如下:
if(requestType!=2 and createdDate < -2days)
delete row;
Run Code Online (Sandbox Code Playgroud)
或者有没有办法可以使用任何语言对某些文档进行更改,以便它们不会过期.
编辑:我通过在预定邮件的情况下使用scheduledDate和requestDate的相同值解决了这个问题.
mongodb ×10
mongodb-indexes ×10
indexing ×3
2dsphere ×1
geojson ×1
javascript ×1
meteor ×1
mongodb-java ×1
mongoose ×1
node.js ×1