GVKun编程网logo

mongodb / mongoose中的部分索引(mongodb索引的功能)

15

在这篇文章中,我们将为您详细介绍mongodb/mongoose中的部分索引的内容,并且讨论关于mongodb索引的功能的相关问题。此外,我们还会涉及一些关于57-1、2、3NoSQL基础及Mongo

在这篇文章中,我们将为您详细介绍mongodb / mongoose中的部分索引的内容,并且讨论关于mongodb索引的功能的相关问题。此外,我们还会涉及一些关于57-1、2、3 NoSQL基础及MongoDB、MongoDB基本应用、mongodb索引及复制集、E11000 mongodb mongoose 中的重复键错误索引、E11000 MongoDB mongoose中的重复键错误索引、egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法的知识,以帮助您更全面地了解这个主题。

本文目录一览:

mongodb / mongoose中的部分索引(mongodb索引的功能)

mongodb / mongoose中的部分索引(mongodb索引的功能)

在稀疏索引文档中,我发现了有关mongodb 3.2部分索引的说明

在版本3.2中进行了更改:从MongoDB
3.2开始,MongoDB提供了创建部分索引的选项。部分索引提供了稀疏索引功能的超集。如果您使用的是MongoDB
3.2或更高版本,则应优先使用部分索引而不是稀疏索引。

部分索引非常有用,我想在项目中使用它们。可以和猫鼬一起使用吗?

答案1

小编典典

在当前的Mongoose版本4.3.7中,您无法在方案中定义部分索引,但仍可以使用MongoDB 3.2的部分索引。

您只需要使用本机驱动程序创建索引。

// ScheduleModel is a Mongoose ModelScheduleModel.collection.createIndex({"type" : 1 } , {background:true , partialFilterExpression : { type :"g" }} , function(err , result){     console.log(err , result);});

之后,每个与匹配的查询partialFilterExpression都将被索引。

57-1、2、3 NoSQL基础及MongoDB、MongoDB基本应用、mongodb索引及复制集

57-1、2、3 NoSQL基础及MongoDB、MongoDB基本应用、mongodb索引及复制集

02MongoDB基本应用


配置环境:

node1:192.168.1.121CentOS release 6.7


[root@node1 ~]# cd mongodb-2.6.4/

[root@node1 mongodb-2.6.4]# ls

mongodb-org-2.6.4-1.x86_64.rpm mongodb-org-shell-2.6.4-1.x86_64.rpm

mongodb-org-mongos-2.6.4-1.x86_64.rpm mongodb-org-tools-2.6.4-1.x86_64.rpm

mongodb-org-server-2.6.4-1.x86_64.rpm


[root@node1 mongodb-2.6.4]# yum install mongodb-org-server-2.6.4-1.x86_64.rpm mongodb-org-shell-2.6.4-1.x86_64.rpm mongodb-org-tools-2.6.4-1.x86_64.rpm -y


[root@node1 mongodb-2.6.4]# cd

[root@node1 ~]# mkdir -p /mongodb/data

[root@node1 ~]# id mongod

uid=496(mongod) gid=492(mongod) groups=492(mongod)

[root@node1 ~]# chown -R mongod.mongod /mongodb/

[root@node1 ~]# vim /etc/mongod.conf

修改

dbpath=/var/lib/mongo

dbpath=/mongodb/data

bind_ip=127.0.0.1

#bind_ip=127.0.0.1

#httpinterface=true

httpinterface=true

rest=true

[root@node1 ~]# service mongod start

[root@node1 ~]# ls /mongodb/data/

journal local.0 local.ns mongod.lock _tmp

[root@node1 ~]# du -sh /mongodb/data/

3.1G /mongodb/data/

[root@node1 ~]# ss -tnl

State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 128 :::39591 :::*

LISTEN 0 128 *:27017 *:*

LISTEN 0 128 :::111 :::*

LISTEN 0 128 *:111 *:*

LISTEN 0 128 *:28017 *:*

LISTEN 0 128 *:46453 *:*

LISTEN 0 128 :::22 :::*

LISTEN 0 128 *:22 *:*

LISTEN 0 128 127.0.0.1:631 *:*

LISTEN 0 128 ::1:631 :::*

LISTEN 0 100 ::1:25 :::*

LISTEN 0 100 127.0.0.1:25 *:*


[root@node1 ~]# mongo --host 192.168.1.121

MongoDB shell version: 2.6.4

connecting to: 192.168.1.121:27017/test

Welcome to the MongoDB shell.

For interactive help,type "help".

For more comprehensive documentation,see

http://docs.mongodb.org/

Questions? Try the support group

http://groups.google.com/group/mongodb-user

> show dbs

admin (empty)

local 0.078GB

> use testdb

switched to db testdb

> db.stats()

{

"db" : "testdb",

"collections" : 0,'Microsoft YaHei';font-size:10px;"> "objects" : 0,'Microsoft YaHei';font-size:10px;"> "avgobjSize" : 0,'Microsoft YaHei';font-size:10px;"> "dataSize" : 0,'Microsoft YaHei';font-size:10px;"> "storageSize" : 0,'Microsoft YaHei';font-size:10px;"> "numExtents" : 0,'Microsoft YaHei';font-size:10px;"> "indexes" : 0,'Microsoft YaHei';font-size:10px;"> "indexSize" : 0,'Microsoft YaHei';font-size:10px;"> "fileSize" : 0,'Microsoft YaHei';font-size:10px;"> "dataFiLeversion" : {


},'Microsoft YaHei';font-size:10px;"> "ok" : 1

}

> db.version()

2.6.4

> db.getCollectionNames()

[ ]


#插入数据

> db.students.insert({name:"tom",age:23})

WriteResult({ "nInserted" : 1 })


> show collections

students

system.indexes

admin (empty)

local 0.078GB

testdb 0.078GB


> db.students.stats()

"ns" : "testdb.students",'Microsoft YaHei';font-size:10px;"> "count" : 1,'Microsoft YaHei';font-size:10px;"> "size" : 112,'Microsoft YaHei';font-size:10px;"> "avgobjSize" : 112,'Microsoft YaHei';font-size:10px;"> "storageSize" : 8192,'Microsoft YaHei';font-size:10px;"> "numExtents" : 1,'Microsoft YaHei';font-size:10px;"> "nindexes" : 1,'Microsoft YaHei';font-size:10px;"> "lastExtentSize" : 8192,'Microsoft YaHei';font-size:10px;"> "paddingFactor" : 1,'Microsoft YaHei';font-size:10px;"> "systemFlags" : 1,'Microsoft YaHei';font-size:10px;"> "userFlags" : 1,'Microsoft YaHei';font-size:10px;"> "totalIndexSize" : 8176,'Microsoft YaHei';font-size:10px;"> "indexSizes" : {

"_id_" : 8176

}



[ "students","system.indexes" ]

> db.students.insert ({name:"jerry",age:40,gender:"M"})

WriteResult({ "nInserted" : 1 })

"ns" : "test.students",'Microsoft YaHei';font-size:10px;">}


#帮助:

> db.mycoll.help()

> db.mycoll.find.help()


> db.students.find()

{ "_id" : ObjectId("58720933110b5df571418845"),"name" : "jerry","age" : 40,"gender" : "M" }

{ "_id" : ObjectId("58720a26110b5df571418846"),"name" : "tom","age" : 23 }


> db.students.count()

2

> db.students.insert({name:"Ou Yangfeng",Age:90,Course:"Hamogong"})

> db.students.insert({name:"Yang Guo",Age:20,Course:"Meinv Quan"})

> db.students.insert({name:"Guo Jing",Age:40,Course:"Xiangchong Shibazhang"})

#查询年龄大于30的记录

> db.students.find({Age:{$gt: 30}})

{ "_id" : ObjectId("58720b48110b5df571418847"),"name" : "Ou Yangfeng","Age" : 90,"Course" : "Hamogong" }

{ "_id" : ObjectId("58720ba8110b5df571418849"),"name" : "Guo Jing","Age" : 40,"Course" : "Xiangchong Shibazhang" }


#查询年龄在20到40之间的记录

> db.students.find({Age:{$in: [20,40]}})

{ "_id" : ObjectId("58720b71110b5df571418848"),"name" : "Yang Guo","Age" : 20,"Course" : "Meinv Quan" }

#查看年龄不在20到40之间的记录

> db.students.find({Age:{$nin: [20,"age" : 23 }

mogong" }


#查看Age或age值不在20到40之间的记录

> db.students.find({$or: [{Age: {$nin: [20,40]}},{age:{$nin:[20,40]}}]})

#查看Age或age值在20到40之间的记录

> db.students.find({$or: [{Age: {$in: [20,{age:{$in:[20,'Microsoft YaHei';font-size:10px;">#查看存在gender字段的记录

> db.students.find({gender: {$exists: true}})


#查看不存在gender字段的记录

> db.students.find({gender: {$exists: false}})



#修改"tom"的age为21

> db.students.update({name:"tom"},{$set: {age: 21}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0,"nModified" : 1 })

#删除age值为21的记录

> db.students.remove({age:21})

WriteResult({ "nRemoved" : 1 })

#统计Age值在20到40之间的记录数

> db.students.find({Age: {$in: [20,40]}}).count()

2


#显示Age值在20到40之间的记录,仅显示满足条件的第一条记录


#显示Age值在20到40之间的记录,第一条记录不显示

#显示Age值大于10的记录,仅显示一条满足条件的记录

> db.students.findOne({Age: {$gt: 10}})

"_id" : ObjectId("58720b48110b5df571418847"),'Microsoft YaHei';font-size:10px;"> "name" : "Ou Yangfeng",'Microsoft YaHei';font-size:10px;"> "Age" : 90,'Microsoft YaHei';font-size:10px;"> "Course" : "Hamogong"

#删除students表

> db.students.drop()

true

> show collections;

system.indexes


"db" : "test",'Microsoft YaHei';font-size:10px;"> "collections" : 2,'Microsoft YaHei';font-size:10px;"> "objects" : 1,'Microsoft YaHei';font-size:10px;"> "avgobjSize" : 48,'Microsoft YaHei';font-size:10px;"> "dataSize" : 48,'Microsoft YaHei';font-size:10px;"> "storageSize" : 16384,'Microsoft YaHei';font-size:10px;"> "numExtents" : 2,'Microsoft YaHei';font-size:10px;"> "fileSize" : 67108864,'Microsoft YaHei';font-size:10px;"> "nsSizeMB" : 16,'Microsoft YaHei';font-size:10px;"> "dataFiLeversion" : {

"major" : 4,'Microsoft YaHei';font-size:10px;"> "minor" : 5

"extentFreeList" : {

"num" : 2,'Microsoft YaHei';font-size:10px;"> "totalSize" : 139264

#删除数据库

> db.dropDatabase()

{ "dropped" : "test","ok" : 1 }


03mongodb索引及复制集[root@node1 ~]# mongo

connecting to: test

> for (i=1;i<=10000;i++) db.students.insert({name:"student"+i,age:(i%120),address:"#85 Wenhua Road,Zhengzhou,China"})

> db.students.find().count()

10000

{ "_id" : ObjectId("5871e94113222f399a5240a3"),'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54561"),"name" : "student1","age" : 1,"address" : "#85 Wenhua Road,China" }

{ "_id" : ObjectId("587232dba7eb9c0c7bd54562"),"name" : "student2","age" : 2,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54563"),"name" : "student3","age" : 3,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54564"),"name" : "student4","age" : 4,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54565"),"name" : "student5","age" : 5,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54566"),"name" : "student6","age" : 6,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54567"),"name" : "student7","age" : 7,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54568"),"name" : "student8","age" : 8,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54569"),"name" : "student9","age" : 9,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd5456a"),"name" : "student10","age" : 10,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd5456b"),"name" : "student11","age" : 11,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd5456c"),"name" : "student12","age" : 12,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd5456d"),"name" : "student13","age" : 13,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd5456e"),"name" : "student14","age" : 14,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd5456f"),"name" : "student15","age" : 15,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54570"),"name" : "student16","age" : 16,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54571"),"name" : "student17","age" : 17,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54572"),"name" : "student18","age" : 18,'Microsoft YaHei';font-size:10px;">{ "_id" : ObjectId("587232dba7eb9c0c7bd54573"),"name" : "student19","age" : 19,China" }


#在name字段上构建一个升序索引

> db.students.ensureIndex({name: 1})

"createdCollectionAutomatically" : false,'Microsoft YaHei';font-size:10px;"> "numIndexesBefore" : 1,'Microsoft YaHei';font-size:10px;"> "numIndexesAfter" : 2,'Microsoft YaHei';font-size:10px;">#显示表中索引

> db.students.getIndexes()

[

{

"v" : 1,'Microsoft YaHei';font-size:10px;"> "key" : {

"_id" : 1

},'Microsoft YaHei';font-size:10px;"> "name" : "_id_",'Microsoft YaHei';font-size:10px;"> "ns" : "testdb.students"

"name" : 1

"name" : "name_1",'Microsoft YaHei';font-size:10px;"> }

]


#删除索引

> db.students.dropIndex("name_1")

{ "nIndexesWas" : 2,"ok" : 1 }

#创建唯一索引

> db.students.ensureIndex({name: 1},{unique: true})

"unique" : true,'Microsoft YaHei';font-size:10px;">]

#创建唯一索引后,新增相同字段值会提示错误

> db.students.insert({name: "student20",age: 20,})

WriteResult({

"nInserted" : 0,'Microsoft YaHei';font-size:10px;"> "writeError" : {

"code" : 11000,'Microsoft YaHei';font-size:10px;"> "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: testdb.students.$name_1 dup key: { : \"student20\" }"

})


> db.students.find({name: "student5000"})

{ "_id" : ObjectId("587232e4a7eb9c0c7bd558e8"),"name" : "student5000","age" : 80,'Microsoft YaHei';font-size:10px;">#显示查找语句执行过程

> db.students.find({name: "student5000"}).explain()

"cursor" : "BtreeCursor name_1",'Microsoft YaHei';font-size:10px;"> "ismultikey" : false,'Microsoft YaHei';font-size:10px;"> "n" : 1,'Microsoft YaHei';font-size:10px;"> "nscannedobjects" : 1,'Microsoft YaHei';font-size:10px;"> "nscanned" : 1,'Microsoft YaHei';font-size:10px;"> "nscannedobjectsAllPlans" : 1,'Microsoft YaHei';font-size:10px;"> "nscannedAllPlans" : 1,'Microsoft YaHei';font-size:10px;"> "scanAndOrder" : false,'Microsoft YaHei';font-size:10px;"> "indexOnly" : false,'Microsoft YaHei';font-size:10px;"> "nYields" : 0,'Microsoft YaHei';font-size:10px;"> "nChunkSkips" : 0,'Microsoft YaHei';font-size:10px;"> "millis" : 0,'Microsoft YaHei';font-size:10px;"> "indexBounds" : {

"name" : [

[

"student5000",'Microsoft YaHei';font-size:10px;"> "student5000"

]

]

"server" : "node1:27017",'Microsoft YaHei';font-size:10px;"> "filterSet" : false

> db.students.find({name: {$gt: "student5000"}}).explain()

"n" : 5552,'Microsoft YaHei';font-size:10px;"> "nscannedobjects" : 5552,'Microsoft YaHei';font-size:10px;"> "nscanned" : 5552,'Microsoft YaHei';font-size:10px;"> "nscannedobjectsAllPlans" : 5552,'Microsoft YaHei';font-size:10px;"> "nscannedAllPlans" : 5552,'Microsoft YaHei';font-size:10px;"> "nYields" : 43,'Microsoft YaHei';font-size:10px;"> "millis" : 13,'Microsoft YaHei';font-size:10px;"> {


}

}

E11000 mongodb mongoose 中的重复键错误索引

E11000 mongodb mongoose 中的重复键错误索引

以下是我在模型中的user架构-user.js

var userSchema = new mongoose.Schema({
    local: {
        name: { type: String },email : { type: String,require: true,unique: true },password: { type: String,require:true },},facebook: {
        id           : { type: String },token        : { type: String },email        : { type: String },name         : { type: String }
    }
});

var User = mongoose.model('User',userSchema);

module.exports = User;

这就是我在控制器中使用它的方式 -

var user = require('./../models/user.js');

这就是我将它保存在数据库中的方式 -

user({'local.email' : req.body.email,'local.password' : req.body.password}).save(function(err,result){
    if(err)
        res.send(err);
    else {
        console.log(result);
        req.session.user = result;
        res.send({"code":200,"message":"Record inserted successfully"});
    }
});

错误 -

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1  dup key: { : null }"}

我检查了数据库集合并且不存在这样的重复条目,让我知道我做错了什么?

仅供参考 - req.body.email并且req.body.password正在获取值。

如果我完全删除,那么它会插入文档,否则即使我在 local.email 中有一个条目,它也会抛出错误“重复”错误

E11000 MongoDB mongoose中的重复键错误索引

E11000 MongoDB mongoose中的重复键错误索引

以下是我useruser.js模型中的架构-

var userSchema = new mongoose.Schema({
    local: {
        name: { type: String },email : { type: String,require: true,unique: true },password: { type: String,require:true },},facebook: {
        id           : { type: String },token        : { type: String },email        : { type: String },name         : { type: String }
    }
});

var User = mongoose.model('User',userSchema);

module.exports = User;

这就是我在控制器中使用它的方式-

var user = require('./../models/user.js');

这就是我将其保存在数据库中的方式-

user({'local.email' : req.body.email,'local.password' : req.body.password}).save(function(err,result){
    if(err)
        res.send(err);
    else {
        console.log(result);
        req.session.user = result;
        res.send({"code":200,"message":"Record inserted successfully"});
    }
});

错误 -

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1  dup key: { : null }"}

我检查了数据库集合,没有这样的重复条目,让我知道我在做什么错吗?

仅供参考- req.body.emailreq.body.password被获取的值。

我也检查了这篇文章,但没有帮助STACK
LINK

如果我将其完全删除,则它将插入文档,否则即使我在local.email中有条目,也会引发错误“ Duplicate”错误

egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法

egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法

索引

索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更
快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询
优化技巧

user.js
var mongoose = require(''./db.js'');
var UserSchema = mongoose.Schema({
    name:String,
    sn:{
        type:String,
    },
    age:Number,
    status:{
        type:Number,
        default:1
    }
})

//定义model操作数据库
// var UserModel = mongoose.model(''User'',UserSchema); //将生成users表
var UserModel = mongoose.model(''User'',UserSchema,''user'');
module.exports = UserModel

查找user表的索引

db.user.getIndexes()

clipboard.png

增加字段sn的索引

    sn:{
        type:String,
        index:true
    },
user.js
var mongoose = require(''./db.js'');
var UserSchema = mongoose.Schema({
    name:String,
    sn:{
        type:String,
        index:true
    },
    age:Number,
    status:{
        type:Number,
        default:1
    }
})

//定义model操作数据库
// var UserModel = mongoose.model(''User'',UserSchema); //将生成users表
var UserModel = mongoose.model(''User'',UserSchema,''user'');
module.exports = UserModel

查找索引

clipboard.png

扩展Mongoose Model的静态方法

user.js
增加UserSchema.statics.findBySn
var mongoose = require(''./db.js'');
var UserSchema = mongoose.Schema({
    name:String,
    sn:{
        type:String,
        index:true
    },
    age:Number,
    status:{
        type:Number,
        default:1
    }
})

UserSchema.statics.findBySn=function(sn,cb){
    this.find({"sn":sn},function(err,docs){
        cb(err,docs)
    })
}

//定义model操作数据库
// var UserModel = mongoose.model(''User'',UserSchema); //将生成users表
var UserModel = mongoose.model(''User'',UserSchema,''user'');
module.exports = UserModel
index.js

先增加sn=123456的数据

var user = new UserModel({
    name:''标题3'',
    age:20,
    sn:"123456"
})
user.save(function(err,doc){
    if(err){
        console.log(err);
        return;
    }
    console.log(doc)
})

使用UserSchema.statics.findBySn方法

var UserModel = require(''./user.js'');
//静态方法
UserModel.findBySn(''123456'', function (err, doc) {
    if (err) {
        console.log(err);
        return;
    }
    console.log(doc)
})

运行

clipboard.png

今天关于mongodb / mongoose中的部分索引mongodb索引的功能的分享就到这里,希望大家有所收获,若想了解更多关于57-1、2、3 NoSQL基础及MongoDB、MongoDB基本应用、mongodb索引及复制集、E11000 mongodb mongoose 中的重复键错误索引、E11000 MongoDB mongoose中的重复键错误索引、egg(25)--mongoose索引 ,扩展Mongoose Model的静态方法和实例方法等相关知识,可以在本站进行查询。

本文标签: