精华内容
下载资源
问答
  • mongodb查询

    2014-07-21 11:55:30
    该界面该我们展示了一些信息:如进程ID是2988,端口号是27017。 打开浏览器输入: http://127.0.0.1:27017/ 我们看到了这样的提示: “You are trying to access MongoDB on the native driver port. For ...
    1 ) . 大于,小于,大于或等于,小于或等于
    

    $gt:大于
    $lt:小于
    $gte:大于或等于
    $lte:小于或等于

    例子:

    db.collection.find({ "field" : { $gt: value } } ); // greater than : field > value
    db.collection.find({ "field" : { $lt: value } } ); // less than : field < value
    db.collection.find({ "field" : { $gte: value } } ); // greater than or equal to : field >= value
    db.collection.find({ "field" : { $lte: value } } ); // less than or equal to : field <= value

    如查询j大于3,小于4:

    db.things.find({j : {$lt: 3}});
    db.things.find({j : {$gte: 4}});

    也可以合并在一条语句内:

    db.collection.find({ "field" : { $gt: value1, $lt: value2 } } ); // value1 < field < value

    2) 不等于 $ne

    例子:

    db.things.find( { x : { $ne : 3 } } );



    3) in 和 not in ($in $nin)

    语法:
    db.collection.find( { "field" : { $in : array } } );

    例子:

    db.things.find({j:{$in: [2,4,6]}});
    db.things.find({j:{$nin: [2,4,6]}});


    4) 取模运算$mod

    如下面的运算:
    db.things.find( "this.a % 10 == 1")

    可用$mod代替:

    db.things.find( { a : { $mod : [ 10 , 1 ] } } )


    5)  $all

    $all和$in类似,但是他需要匹配条件内所有的值:

    如有一个对象:

    { a: [ 1, 2, 3 ] }

    下面这个条件是可以匹配的:

    db.things.find( { a: { $all: [ 2, 3 ] } } );

    但是下面这个条件就不行了:

    db.things.find( { a: { $all: [ 2, 3, 4 ] } } );

    6)  $size

    $size是匹配数组内的元素数量的,如有一个对象:{ a:["foo"] },他只有一个元素:

    下面的语句就可以匹配:db.things.find( { a : { $size: 1 } } );

    官网上说不能用来匹配一个范围内的元素,如果想找$size<5之类的,他们建议创建一个字段来保存元素的数量。

    You cannot use $size to find a range of sizes (for example: arrays with more than 1 element). If you need to query for a range, create an extra size field that you increment when you add elements.

    7)$exists

    $exists用来判断一个元素是否存在:

    如:

    db.things.find( { a : { $exists : true } } ); // 如果存在元素a,就返回
    db.things.find( { a : { $exists : false } } ); // 如果不存在元素a,就返回

    8)  $type

    $type 基于 bson type来匹配一个元素的类型,像是按照类型ID来匹配,不过我没找到bson类型和id对照表。

    db.things.find( { a : { $type : 2 } } ); // matches if a is a string
    db.things.find( { a : { $type : 16 } } ); // matches if a is an int
    9)正则表达式

    mongo支持正则表达式,如:

    db.customers.find( { name : /acme.*corp/i } ); // 后面的i的意思是区分大小写

    10)  查询数据内的值

    下面的查询是查询colors内red的记录,如果colors元素是一个数据,数据库将遍历这个数组的元素来查询。db.things.find( { colors : "red" } );

    11) $elemMatch

    如果对象有一个元素是数组,那么$elemMatch可以匹配内数组内的元素:

    > t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } ) 
    { "_id" : ObjectId("4b5783300334000000000aa9"), 
    "x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]
    }$elemMatch : { a : 1, b : { $gt : 1 } } 所有的条件都要匹配上才行。

    注意,上面的语句和下面是不一样的。

    > t.find( { "x.a" : 1, "x.b" : { $gt : 1 } } )
    $elemMatch是匹配{ "a" : 1, "b" : 3 },而后面一句是匹配{ "b" : 99 }, { "a" : 11 } 


    12)  查询嵌入对象的值

    db.postings.find( { "author.name" : "joe" } );

    注意用法是author.name,用一个点就行了。更详细的可以看这个链接: dot notation

    举个例子:

    > db.blog.save({ title : "My First Post", author: {name : "Jane", id : 1}})

    如果我们要查询 authors name 是Jane的, 我们可以这样:

    > db.blog.findOne({"author.name" : "Jane"})

    如果不用点,那就需要用下面这句才能匹配:

    db.blog.findOne({"author" : {"name" : "Jane", "id" : 1}})

    下面这句:

    db.blog.findOne({"author" : {"name" : "Jane"}})

    是不能匹配的,因为mongodb对于子对象,他是精确匹配。

    13) 元操作符 $not 取反

    如:

    db.customers.find( { name : { $not : /acme.*corp/i } } );db.things.find( { a : { $not : { $mod : [ 10 , 1 ] } } } ); mongodb还有很多函数可以用,如排序,统计等,请参考原文。


    日期:{"date":{$lt:ISODate("2013-01-17T01:16:33.303Z")}}






    一,简介

       MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

       MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。

         MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

        传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

     

    二,特点

      它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

      1)面向集合存储,易存储对象类型的数据。

      2)模式自由。

      3)支持动态查询。

      4)支持完全索引,包含内部对象。

      5)支持查询。

      6)支持复制和故障恢复。

      7)使用高效的二进制数据存储,包括大型对象(如视频等)。

      8)自动处理碎片,以支持云计算层次的扩展性。

      9)支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

      10)文件存储格式为BSON(一种JSON的扩展)。

      11)可通过网络访问。

     

    三,下载安装和开启服务器

    3.1)MongoDB 当前版本是2.0.4,下载地址:http://www.mongodb.org/downloads。提供了各种平台的版本。我这里选择的是Windows平台下的。

    3.2)新建目录E:\ mongodb , 将下载的压缩包解压到此目录。bin文件夹下有一堆.exe 文件

    其中有两个最重要的文件:Mongod.exe和Mongo.exe 。

    Mongod.exe 是用来连接到mongo数据库服务器的,即服务器端。

    Mongo.exe 是用来启动MongoDB shell的,即客户端。

    其他文件:

    mongodump 逻辑备份工具。

    mongorestore 逻辑恢复工具。

    mongoexport  数据导出工具。

    mongoimport  数据导入工具。

    3.3)开启服务器

     第一步:新建一个目录用来存放MongoDB的数据库文件,即dbpath。随便建在那都可以,我这里建在 E:\MongoDBFiles 。 这是为了下一步使用的。

     第二步:打开CMD窗口,键入如下命令

    复制代码
    > e:
    
    
    
    > cd e:\mongodb\mongodb-win32-i386-2.0.4\bin
    
    
    
    > mongod.exe -dbpath "E:\mongodbfiles"
    复制代码

    最后一行命令中的-dbpath 参数值就是我们第一步新建的文件夹。这个文件夹一定要在开启服务之前事先建立好,否则会报错,mongodb不会自己创建。

    如果操作成功会出现如下界面:

    该界面该我们展示了一些信息:如进程ID是2988,端口号是27017。

    打开浏览器输入:http://127.0.0.1:27017/

    我们看到了这样的提示:

    “You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number”

    到此,MongoDB数据库服务已经成功启动了。

     

    四,使用mongo.exe 执行数据库增删改查操作

    mongodb 为我们提供的客户端管理工具是mongo.exe

    4.1)创建数据库:

     双击打开mongo.exe 出现如下界面:

     

    该界面的意思是,当前连接的数据库是test,这是系统默认将要创建的。为什么说是“将要创建的”呢?因为此时并不存在此数据库,或者说它现在还只在内存中,并没有创建在物理磁盘上。不信,你看MongoDBFiles文件夹下面除了mongod.lock外,什么都没有。只有当你执行了插入数据的命令后,该数据库才会真正的创建。

     

    好了,我们暂时不管这个test了。现在我们来创建一个叫cnblogs 的数据库。

    在shell 命令窗口键入如下命令:

    > use cnblogs // use 命令用来切换当前数据库,如果该数据库不存在,则会先新建一个。

     4.2)创建collection并插入数据

     在传统关系型数据库中,创建完了库后接下来会创建表,但是在mongoDB中没有“表”的概念,与其对应的一个概念是集合,即collection。

     在shell 命令窗口键入如下命令:

    > db.users.insert({'name':'xumingxiang','sex':'man'})
    
    // 这条命令是向users 集合中插入一条数据。如果集合users不存在,则会先新建一个,然后再插入数据,参数以JSON格式传入。

     因为我们后面要测试删除数据,所以我们再插入一条数据:

     > db.users.insert({'name':xiangshu','sex':'man'})

    4.3)在上面4.1)和4.2)我们创建了数据库,创建了集合,还插入了两条数据,那么这些操作有没有执行成功呢?我们来查询一下:

    在shell 命令窗口键入如下命令:

    复制代码
    > show dbs // 显示所有数据库
    
    
    
    >show collections // 显示当前数据库下的所有集合
    
    
    
    >db.users.find() // 显示users集合下的所有数据文档
    复制代码

     shell 界面如下:

     看我用红色标记的部分。这说明我们之前的操作是成功的。我们还看到系统给每条记录分配了一个惟一主键 _id 。

    4.4)更新数据

     现在我们要把第二条数据的sex改成女即“women”

     在shell 命令窗口键入如下命令:

    > db.users.update({'name':'xiangshu'},{'$set':{'sex':'women'}},upsert=true,multi=false)

     解释一下几个参数:

     第一:查询的条件

     第二:更新的字段

     第三:如果不存在则插入

     第四:是否允许修改多条记录

    4.5)删除记录

     我们现在要把第一条记录即'name'为'xumingxiang'的

     在shell 命令窗口键入如下命令:

     > db. users.remove({'name':'xumingxiang'})

     我们在检验一下4)5)两步有没有操作成功,在shell 命令窗口键入如下命令:

     > db.users.find() 

     从输出的界面我们看到现在只剩下一条'name'为'xiangshu'的了,并且它的'sex'为'women',这说明4)5)两步操作成功了。

     4.6)删除所有记录

     > db.users.remove()

     4.7) 删除collection

    > db.users.drop() //如果删除成功会返回“true”,否则返回“false”

     4.8)删除当前数据库

     > db.dropDatabase()

     

    五,更多命令

    db.AddUser(username,password)  添加用户

    db.auth(usrename,password)     设置数据库连接验证

    db.cloneDataBase(fromhost)     从目标服务器克隆一个数据库
    db.commandHelp(name)           returns the help for the command
    db.copyDatabase(fromdb,todb,fromhost)  复制数据库fromdb---源数据库名称,todb---目标数据库名称,fromhost---源数据库服务器地址
    db.createCollection(name,{size:3333,capped:333,max:88888})  创建一个数据集,相当于一个表
    db.currentOp()                 取消当前库的当前操作
    db.dropDataBase()              删除当前数据库
    db.eval(func,args)             run code server-side
    db.getCollection(cname)        取得一个数据集合,同用法:db['cname'] or
    db.getCollenctionNames()       取得所有数据集合的名称列表
    db.getLastError()              返回最后一个错误的提示消息
    db.getLastErrorObj()           返回最后一个错误的对象
    db.getMongo()                  取得当前服务器的连接对象get the server
    db.getMondo().setSlaveOk()     allow this connection to read from then nonmaster membr of a replica pair
    db.getName()                   返回当操作数据库的名称
    db.getPrevError()              返回上一个错误对象
    db.getProfilingLevel()         
    db.getReplicationInfo()        获得重复的数据
    db.getSisterDB(name)           get the db at the same server as this onew
    db.killOp()                    停止(杀死)在当前库的当前操作
    db.printCollectionStats()      返回当前库的数据集状态
    db.printReplicationInfo()
    db.printSlaveReplicationInfo()
    db.printShardingStatus()       返回当前数据库是否为共享数据库
    db.removeUser(username)        删除用户
    db.repairDatabase()            修复当前数据库
    db.resetError()                
    db.runCommand(cmdObj)          run a database command. if cmdObj is a string, turns it into {cmdObj:1}
    db.setProfilingLevel(level)    0=off,1=slow,2=all
    db.shutdownServer()            关闭当前服务程序
    db.version()                   返回当前程序的版本信息

     

    db.test.find({id:10})          返回test数据集ID=10的数据集
    db.test.find({id:10}).count()  返回test数据集ID=10的数据总数
    db.test.find({id:10}).limit(2) 返回test数据集ID=10的数据集从第二条开始的数据集
    db.test.find({id:10}).skip(8)  返回test数据集ID=10的数据集从0到第八条的数据集
    db.test.find({id:10}).limit(2).skip(8)  返回test数据集ID=1=的数据集从第二条到第八条的数据
    db.test.find({id:10}).sort()   返回test数据集ID=10的排序数据集
    db.test.findOne([query])       返回符合条件的一条数据
    db.test.getDB()                返回此数据集所属的数据库名称
    db.test.getIndexes()           返回些数据集的索引信息
    db.test.group({key:...,initial:...,reduce:...[,cond:...]})
    db.test.mapReduce(mayFunction,reduceFunction,<optional params>)
    db.test.remove(query)                      在数据集中删除一条数据
    db.test.renameCollection(newName)          重命名些数据集名称
    db.test.save(obj)                          往数据集中插入一条数据
    db.test.stats()                            返回此数据集的状态
    db.test.storageSize()                      返回此数据集的存储大小
    db.test.totalIndexSize()                   返回此数据集的索引文件大小
    db.test.totalSize()                        返回些数据集的总大小
    db.test.update(query,object[,upsert_bool]) 在此数据集中更新一条数据
    db.test.validate()                         验证此数据集
    db.test.getShardVersion()                  返回数据集共享版本号

     

    六,MongoDB语法与现有关系型数据库SQL语法比较

    MongoDB语法                                   MySql语法
    db.test.find({'name':'foobar'}) <==> select * from test where name='foobar'
    db.test.find()                  <==> select * from test
    db.test.find({'ID':10}).count() <==> select count(*) from test where ID=10
    db.test.find().skip(10).limit(20)     <==> select * from test limit 10,20
    db.test.find({'ID':{$in:[25,35,45]}}) <==> select * from test where ID in (25,35,45)
    db.test.find().sort({'ID':-1})        <==> select * from test order by ID desc
    db.test.distinct('name',{'ID':{$lt:20}})  <==> select distinct(name) from test where ID<20
    db.test.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:{msum:0}})  <==> select name,sum(marks) from test group by name
    db.test.find('this.ID<20',{name:1})  <==> select name from test where ID<20
    db.test.insert({'name':'foobar','age':25})<==>insert into test ('name','age') values('foobar',25)
    db.test.remove({})                <==> delete * from test
    db.test.remove({'age':20})        <==> delete test where age=20
    db.test.remove({'age':{$lt:20}})  <==> elete test where age<20
    db.test.remove({'age':{$lte:20}}) <==> delete test where age<=20
    db.test.remove({'age':{$gt:20}})  <==> delete test where age>20
    db.test.remove({'age':{$gte:20}}) <==> delete test where age>=20
    db.test.remove({'age':{$ne:20}})  <==> delete test where age!=20
    db.test.update({'name':'foobar'},{$set:{'age':36}}) <==> update test set age=36 where name='foobar'
    db.test.update({'name':'foobar'},{$inc:{'age':3}})  <==> update test set age=age+3 where name='foobar'

    注意以上命令大小写敏感

     

    七,可视化的客户端管理工具MongoVUE

    使用mongo.exe 管理数据库虽然可行,功能也挺强大,但每次都要敲命令,即繁琐枯燥而且效率低下。下面介绍一款Windows下的可视化操作的管理工具MongoVUE

    下载地址:http://www.mongovue.com/downloads/

    运行效果如下:

     

     

    八,在C#中使用官方驱动操作MongoDB

     8.1)下载安装

     想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动。C#版的驱动有很多种,如官方提供的,samus。 实现思路大都类似。这里我们先用官方提供的mongo-csharp-driver ,当前版本为1.4.1

    下载地址:http://github.com/mongodb/mongo-csharp-driver/downloads

    编译之后得到两个dll

     MongoDB.Driver.dll:顾名思义,驱动程序

     MongoDB.Bson.dll:序列化、Json相关

     然后在我们的程序中引用这两个dll。

     下面的部分简单演示了怎样使用C#对MongoDB进行增删改查操作。

     8.2)连接数据库:

     在连接数据库之前请先确认您的MongoDB已经开启了。

    复制代码
    //数据库连接字符串
    
     const string strconn = "mongodb://127.0.0.1:27017";
    
    //数据库名称
    
     const string dbName = "cnblogs";
    
    //创建数据库链接
    
     MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);
    
    //获得数据库cnblogs
    
     MongoDatabase db = server.GetDatabase(dbName);
    复制代码

    8.3)插入数据:

    好了数据打开了,现在得添加数据了,我们要添加一条User“记录”到 Users集合中。

    在MongoDB中没有表的概念,所以在插入数据之前不需要创建表。

    但我们得定义好要插入的数据的模型Users

    复制代码
    Users.cs:
    
    public class Users
    
    {
    
    public ObjectId _id;//BsonType.ObjectId 这个对应了 MongoDB.Bson.ObjectId 
    
         public string Name { get; set; }
    
    public string Sex { set; get; }
    
    }
    复制代码

    _id 属性必须要有,否则在更新数据时会报错:“Element '_id' does not match any field or property of class”。

     好,现在看看添加数据的代码怎么写:

    复制代码
    public void Insert()
    
    {
    
    //创建数据库链接
    
     MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);
    
    //获得数据库cnblogs
    
     MongoDatabase db = server.GetDatabase(dbName);
    
    Users users = new Users();
    
    users.Name = "xumingxiang";
    
    users.Sex = "man";
    
    //获得Users集合,如果数据库中没有,先新建一个
    
     MongoCollection col = db.GetCollection("Users");
    
    //执行插入操作
    
     col.Insert<Users>(users);
    
    }
    复制代码

    8.4)更新数据

    复制代码
    public void Update()
    
    {
    
    //创建数据库链接
    
     MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);
    
    //获得数据库cnblogs
    
     MongoDatabase db = server.GetDatabase(dbName);
    
    //获取Users集合
    
     MongoCollection col = db.GetCollection("Users");
    
    //定义获取“Name”值为“xumingxiang”的查询条件
    
     var query = new QueryDocument { { "Name", "xumingxiang" } };
    
    //定义更新文档
    
     var update = new UpdateDocument { { "$set", new QueryDocument { { "Sex", "wowen" } } } };
    
    //执行更新操作
    
     col.Update(query, update);
    
    }
    复制代码

    8.5)删除数据

    复制代码
    public void Delete()
    
    {
    
    //创建数据库链接
    
     MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);
    
    //获得数据库cnblogs
    
     MongoDatabase db = server.GetDatabase(dbName);
    
    //获取Users集合
    
     MongoCollection col = db.GetCollection("Users");
    
    //定义获取“Name”值为“xumingxiang”的查询条件
    
     var query = new QueryDocument { { "Name", "xumingxiang" } };
    
    //执行删除操作
    
     col.Remove(query);
    
    }
    复制代码

    8.6)查询数据

    复制代码
    //引用
    //using MongoDB.Driver.Builders;
    //using MongoDB.Bson;
    public void Query()
    {
    
        //创建数据库链接
        MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);
    
        //获得数据库cnblogs
        MongoDatabase db = server.GetDatabase(dbName);
        //获取Users集合
    
        MongoCollection col = db.GetCollection("Users");
    
        //定义获取“Name”值为“xumingxiang”的查询条件
        var query = new QueryDocument { { "Name", "xumingxiang" } };
        //当然,我想你也许会喜欢这样写:  
        var query = Query.EQ("Name", "xumingxiang");    // 等于
            //类似的还有:
            query = Query.NE("Name", "xumingxiang");     //不等于
            query = Query.GT("Age", 25);                 //大于
            query = Query.GTE("Age", 25);                //大于等于
            query = Query.LT("Age", 25);                 //小于
            query = Query.LTE("Age", 25);                //小于等于
    
            //子查询
            query = Query.In("Age", new List<BsonInt32> { 25, 26, 27 });        //查询Age的值在25、26、27范围内的数据   
            query = Query.NotIn("Age", new List<BsonInt32> { 25, 26, 27 });     //查询Age的值不在25、26、27范围内的数据   
    
            //And 操作
            query = Query.And( Query.GT("Age",20),Query.LT("Sex","") );
    
            //Or 操作
            query = Query.Or(Query.GT("Age", 20), Query.LT("Sex", ""));
    
    
            query = Query.Exists("BirthDay");       //存在 名为 BirthDay 的字段的数据
            query = Query.NotExists("BirthDay");    //不存在 名为 BirthDay 的字段的数据
    
            query = Query.Mod("Age", 10, 1);        //查询age取模10等于1的数据
                
    
        var sort = SortBy.Ascending("Age");             //顺序排列
        sort = SortBy.Descending("Age");                //倒序排列
    
        //上面这写代码你可能更喜欢写成泛型的形式,那样会更符合您的编码哲学,该驱动也是支持的,如:
        var  tQuery = Query<Users>.In(x => x.Age, new List<BsonInt32> { 25, 26, 27 });   
        var  tSort = SortBy<Users>.Descending(x=>x.Age);
    
    
        //查询全部集合里的数据
        var result1 = col.FindAllAs<Users>().ToList();
    
        //查询第一条数据,查询条件可缺省。
        var result2 = col.FindOneAs<Users>();
        //查询指定查询条件的全部数据
        var result3 = col.FindAs<Users>(query)  //筛选条件
            .SetSortOrder(sort)             //排序
            .Distinct()                     //排重
            .Skip(20)                       //跳过前20个
            .Take(10)                       //取后面的10个 
            .ToList();
    
    
    
    }
    复制代码

    注:如果实体类的属性是DateTime类型, MongoDB查询出来的是UTC时间,即比本地时间小8小时,解决此问题,需要给属性加上特性Attribute,如:

    [BsonDateTimeOptions(Kind = DateTimeKind.Local)] 
    public DateTime OperTime { get; set; }















    mongodb目前没有或(or)操作符,只能用变通的办法代替,可以参考下面的链接:

    http://www.mongodb.org/display/DOCS/OR+operations+in+query+expressions






    展开全文
  • MongoDB 查询条件

    千次阅读 2012-03-20 12:46:41
    查询(来源于mongodb权威指南)http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24ne Advanced Queries .spacetree * ul{ padding-left:0px; margin-left: 0px; } .spacetree * li{ ...
    查询(来源于mongodb权威指南)
    http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24ne
    
    Advanced Queries

    and
    find({key:value,key:value})
    指定返回的键
    find({},{key:1,key:0})

    查询条件
    $lt<
    $lte <=
    $gt >
    $gte >=


    find({key:{$get:18,$lte:30}})

    $in 可以用来查询一个键的多个值。
    $nin 将返回与数组中所有条件都不匹配的文档。
    find({key:{$in:[18,30]}})

    $ne:不等于,或不在数组中
    ffind({key:{&ne:value}})


    $or更通用一些,用来完成多个键值的任意给定值。
    find({$or:[{key:value},{key:value}]})

    $not是元条件句,即可以用在任何其他条件之上。
    $mod会将查询的值除以第一个给定的值,若余数等于第二个给定值则返回该结果。
    fnd({key:{$not:{$mod:[5,1]}}})

    条件句规则
    条件句是内层文档的键,而修改器则是外层文档的键。
    一个键可以有多个条件,但是一个键不能对应多个更新修改器。

    null不仅匹配自身,而且匹配不存在的。所以这种匹配还会返回缺少这个键的所有文档。
    $exists判段键值已存在。
    find({key:{$in:[null],$exists:true}})

    数组

    $all 会匹配一组元素。
    要找既有apple,又有banana的文档,就得用$all来查询
    find({fruit:{$all:["apple","banana"]}})

    想查询数组指定位置的元素,则需要使用key.index语法指定下标
    find({key.2:value})

    $size 可以用其查询指定长度的数组。$size并不能与其他查询子句组合。
    find({key:{$size:3}})

    $slice find的第二个参数是可选的,可以指定返回那些键。$slice返回数组的一个子集合。
    findOne(条件,{key:{$slice:10}}) 返回数组的前10条记录
    findOne(条件,{key:{$slice:-10}}) 返回数组的后10条记录
    findOne(条件,{key:{$slice:[23,10]}}) 偏移值23开始的10条记录


    查询内嵌文档
    find({key.subkey:value,key.subkey:value})
    $elemMatch 将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到。
    find(key:{$elemMatch:{key:value,key:value}})

    $where 可以执行任意JavaScript作为查询的一部分。
    find($where:"this.x+this.y==10")

    find($where:"function(){return 1;}")


    Mongodb数据库操作语法

    db.AddUser(username,password)添加用户
    db.auth(usrename,password)设置数据库连接验证
    db.cloneDataBase(fromhost)从目标服务器克隆一个数据库
    db.commandHelp(name)返回某条操作命令的帮助
    db.copyDatabase(fromdb,todb,fromhost)复制数据库fromdb—源数据库名称,todb—目标数据库名称,fromhost—源数据库服务器地址
    db.createCollection(name,{size:3333,capped:333,max:88888})创建一个数据集,相当于一个表
    db.currentOp()取消当前库的当前操作
    db.dropDataBase()删除当前数据库
    db.eval(func,args)run code server-side
    db.getCollection(cname)取得一个数据集合,同用法:db['cname'] or db.cname
    db.getCollenctionNames()取得所有数据集合的名称列表
    db.getLastError()返回最后一个错误的提示消息
    db.getLastErrorObj()返回最后一个错误的对象
    db.getMongo()取得当前服务器的连接对象get the server connection object
    db.getMondo().setSlaveOk()allow this connection to read from then nonmaster membr of a replica pair
    db.getName()返回当操作数据库的名称
    db.getPrevError()返回上一个错误对象
    db.getProfilingLevel()?什么等级
    db.getReplicationInfo()?什么信息
    db.getSisterDB(name)get the db at the same server as this onew
    db.killOp()停止(杀死)在当前库的当前操作
    db.printCollectionStats()返回当前库的数据集状态
    db.printReplicationInfo() 
    db.printSlaveReplicationInfo() 
    db.printShardingStatus()返回当前数据库是否为共享数据库
    db.removeUser(username)删除用户
    db.repairDatabase()修复当前数据库
    db.resetError()error
    db.runCommand(cmdObj)run a database command. if cmdObj is a string, turns it into {cmdObj:1}
    db.setProfilingLevel(level)0=off,1=slow,2=all
    db.shutdownServer()关闭当前服务程序
    db.version()返回当前程序的版本信息
    数据集(表)操作语法数据集(表)操作语法
    db.linlin.find({id:10})返回linlin数据集ID=10的数据集
    db.linlin.find({id:10}).count()返回linlin数据集ID=10的数据总数
    db.linlin.find({id:10}).limit(2)返回linlin数据集ID=10的数据集从第二条开始的数据集
    db.linlin.find({id:10}).skip(8)返回linlin数据集ID=10的数据集从0到第八条的数据集
    db.linlin.find({id:10}).limit(2).skip(8)返回linlin数据集ID=1=的数据集从第二条到第八条的数据
    db.linlin.find({id:10}).sort()返回linlin数据集ID=10的排序数据集
    db.linlin.findOne([query])返回符合条件的一条数据
    db.linlin.getDB()返回此数据集所属的数据库名称
    db.linlin.getIndexes()返回些数据集的索引信息
    db.linlin.group({key:…,initial:…,reduce:…[,cond:...]}) 
    db.linlin.mapReduce(mayFunction,reduceFunction,<optional params>) 
    db.linlin.remove(query)在数据集中删除一条数据
    db.linlin.renameCollection(newName)重命名些数据集名称
    db.linlin.save(obj)往数据集中插入一条数据
    db.linlin.stats()返回此数据集的状态
    db.linlin.storageSize()返回此数据集的存储大小
    db.linlin.totalIndexSize()返回此数据集的索引文件大小
    db.linlin.totalSize()返回些数据集的总大小
    db.linlin.update(query,object[,upsert_bool])在此数据集中更新一条数据
    db.linlin.validate()验证此数据集
    db.linlin.getShardVersion()返回数据集共享版本号
    db.linlin.find({‘name’:'foobar’})select * from linlin where name=’foobar’
    db.linlin.find()select * from linlin
    db.linlin.find({‘ID’:10}).count()select count(*) from linlin where
    db.linlin.find().skip(10).limit(20)从查询结果的第十条开始读20条数据
    select * from linlin limit 10,20———-mysql 
    db.linlin.find({‘ID’:{$in:[25,35,45]}})select * from linlin where ID in (25,35,45)
    db.linlin.find().sort({‘ID’:-1})select * from linlin order by ID desc
    db.linlin.distinct(‘name’,{‘ID’:{$lt:20}})select distinct(name) from linlin where ID<20
      
    db.linlin.group({key:{‘name’:true},cond:{‘name’:'foo’},reduce:function(obj,prev){prev.msum=obj.marks;},initial:{msum:0}})select name,sum(marks) from linlin group by name
    db.linlin.find(‘this.ID<20′,{name:1})select name from linlin where ID<20
    db.linlin.insert({‘name’:'foobar’,'age’:25})insert into linlin (‘name’,'age’) values(‘foobar’,25)
    db.linlin.remove({})delete * from linlin
    db.linlin.remove({‘age’:20})delete linlin where age=20
    db.linlin.remove({‘age’:{$lt:20}})delete linlin where age<20
    db.linlin.remove({‘age’:{$lte:20}})delete linlin where age<=20
    db.linlin.remove({‘age’:{$gt:20}})delete linlin where age>20
    db.linlin.remove({‘age’:{$gte:20}})delete linlin where age>=20
    db.linlin.remove({‘age’:{$ne:20}})delete linlin where age!=20
    db.linlin.update({‘name’:'foobar’},{$set:{‘age’:36}})update linlin set age=36 where name=’foobar’
    db.linlin.update({‘name’:'foobar’},{$inc:{‘age’:3}})update linlin set age=age+3 where name=’foobar’

    展开全文
  • mongoDB查询某个经纬度附近的用户

    千次阅读 2016-12-02 16:55:49
    需求:获取某个点100m内的用户 数据库:mongoDB ...}查询地理位置用到geoWithin,可以查询多边形的地理位置信息,地球接近圆形,这里用到geoWithin, 可以查询多边形的地理位置信息,地球接近圆形,这里用

    需求:获取某个点100m内的用户
    数据库:mongoDB
    语言:JAVA
    1.地理位置数据以GeoJSON 的格式存储的

    loc : {
        type : "Point",
        coordinates : [lng, lat]
    }

    查询地理位置用到 geoWithin centerSphere, 查询语句为

    {
       location field: {
          $geoWithin: { $centerSphere: [ [ x, y ], radius] }
       }
    }

    x,y为中心点的经纬度,radius为距离中心点的距离,$centerSphere 使用弧度(radians)作为距离
    距离与弧度之间的转换:
    distance to radians: divide the distance by the radius of the sphere (e.g. the Earth) in the same units as the distance measurement.
    radians to distance: multiply the radian measure by the radius of the sphere (e.g. the Earth) in the units system that you want to convert the distance to.
    地球赤道的半径为3963.2 miles, 即 6378.1 kilometers, 只查找100m范围内,则radius为100/6378100。
    参考信息:
    geowithin
    centerSphere
    calculate distances

    Coordinates中数据类似如下:

    {
        "_id" : ObjectId("58403433785509513efe3279"),
        "account" : "18520222222",
        "platform" : "android",
        "location" : {
            "type" : "Point",
            "coordinates" : [ 
                108.840974298098, 
                34.2789316522934
            ]
        },    
        "collectTime" : 1480602671,
        "logTime" : 1480602675
    }

    JAVA代码,此处只写了unit test, 简单测试代码逻辑。实际使用需要做相应改动。

    package mongo;
    
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    
    
    import org.bson.Document;
    import org.junit.Before;
    import org.junit.Test;
    
    import com.mongodb.BasicDBList;
    import com.mongodb.BasicDBObject;
    import com.mongodb.MongoClient;
    import com.mongodb.MongoClientOptions;
    import com.mongodb.MongoCredential;
    import com.mongodb.MongoException;
    import com.mongodb.ServerAddress;
    import com.mongodb.client.MongoCursor;
    import com.mongodb.client.MongoDatabase;
    
    
    public class CoordinatesTest {
    
        public static final String mgoHost = "127.0.0.1:27017";
        public static final String mgoUser = "test";
        public static final String mgoPwd = "123456";
        public static final String mgoDB = "info";  
    
        private static MongoDatabase db = null;     
    
        @SuppressWarnings("resource")
        public void initMongo() throws UnknownHostException, MongoException {
            MongoClientOptions.Builder build = new MongoClientOptions.Builder();
            build.connectionsPerHost(50);
            build.threadsAllowedToBlockForConnectionMultiplier(50);
            build.maxWaitTime(1000*60*2);
            build.connectTimeout(1000*30);
            build.socketTimeout(1000*30);
    
            List<ServerAddress> seeds = new ArrayList<ServerAddress>();
            seeds.add(new ServerAddress(mgoHost));
            MongoCredential credentials = MongoCredential.createScramSha1Credential(mgoUser, mgoDB, mgoPwd.toCharArray());
            List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
            credentialsList.add(credentials);
            MongoClient mongoClient = new MongoClient(seeds, credentialsList, build.build());
            db = mongoClient.getDatabase(mgoDB);
        }
    
    
        public static List<String> distinct(String coll, BasicDBObject query, String key) {        
            List<String> list = new ArrayList<String>();
            MongoCursor<Document> cursor = null;
            try {
                cursor = db.getCollection(coll).find(query).projection(new BasicDBObject(key, 1)).iterator();
                if (cursor != null) {
                    HashSet<String> set = new HashSet<String>();
                    while (cursor.hasNext()){
                        Document doc = cursor.next();
                        String val = doc.getString(key);
                        if (!set.contains(val)) {
                            set.add(val);
                        }
                    }
                    list.addAll(set);
                }
            } catch (Throwable e) {
                System.err.println("coll:"+coll+", query:"+query+", key:"+key+", occur exception: " + e.getMessage());
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
            return list;
        }
    
        public static List<String> getAccountsByLocation(double longitude, double latitude, double radius) {
            BasicDBList point = new BasicDBList();
            point.add(longitude);
            point.add(latitude);
            Double distance = radius/6378100;
            BasicDBList centerSphere = new BasicDBList();
            centerSphere.add(point);
            centerSphere.add(distance);
            BasicDBObject location = new BasicDBObject("$geoWithin", new BasicDBObject("$centerSphere", centerSphere));
            BasicDBObject query = new BasicDBObject("location", location);
    
            List<String> list = new ArrayList<String>();
            try {
                list = CoordinatesTest.distinct("Coordinates", query, "account");
            } catch (MongoException e) {
                System.err.println(e.getMessage());
            }
            return list;
        }
    
    
        @Before
        public void init() throws Exception {
            initMongo();
        }
    
        @Test
        public void test1() {
            List<String> accountList = getAccountsByLocation(113.941892, 22.50986, 100);
            System.out.println(accountList);
        }
    }
    展开全文
  • MongoDB联合查询

    2019-10-07 10:32:53
    MongoDB联合查询 2012-04-15 16:32:44| 分类: MongoDB | 标签:mongodb mongodb联合查询 |举报 |字号大中小 订阅 1、简单手工关联 首先将结果查询出来放到一个变量里面,然后再查询 u = db.user....

    MongoDB联合查询 

    2012-04-15 16:32:44|  分类: MongoDB |  标签:mongodb  mongodb联合查询  |举报 |字号 订阅

     
     
    1、简单手工关联
    首先将结果查询出来放到一个变量里面,然后再查询
    u = db.user.findOne({author:"wangwenlong"});
    for(var p = db.postings.find({author:u.author});p.hasNext;){
      printjson(p.next().title);
    }
    2、DBRef方式关联
    例子:
    步骤1 取得当前用户信息
    db.user.insert({name:"wangwenlong"})
    u1 = db.user.find({name:"wangwenlong"})[0]
    步骤2 发帖子并做关联
    db.postings.insert({"title":"Hello MongoDB!"},users:[new DBRef('users',u1._id)])
    db.postings.insert({"title":"Hello China!"},users:[new DBRef('users',u1._id)])
    步骤3 通知贴子茶轴用户信息
    db.postings.find({title:"Hello China!"})[0].users[0].fetch()

    转载于:https://www.cnblogs.com/HuiLove/p/3981257.html

    展开全文
  • MongoDB之聚合查询

    千次阅读 2018-08-26 15:12:29
    聚合框架是MongoDB的高级查询语言,允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。通俗一点来说,可以把MongoDB的聚合查询等价于SQL的GROUP BY语句。 聚合操作过程可以理...
  • Mongodb联合查询

    2016-06-30 10:04:36
    在关系型数据库中,通过连接运算符可以实现多个表联合查询。而非关系型数据库的特点是表之间属于弱关联,Mongodb作为Nosql代表,其本身特性不建议对多Collection关联处理,不过对于有些需要对多表关联处理的需求,...
  • 前言对于nodejs而言,标配但数据库便是mongodb了。而我认为nodejs对于mongodb的操作最为便捷的插件之一就是mongoose,所有我们去掌握mongoose的基本配置就很有必要了,本章主要和大家分享下mongoose的学习使用经验。...
  • MongoDB查询详解

    2020-10-15 09:41:05
    MongoDB 中,查询通常针对一个集合来操作。查询可以指定查询条件,只返回匹配的文档;还可以指定投影项,只返回指定的字段,减少返回数据到客户端的网络流量。 1、MongoDB 查询文档使用 find() 方法。 find() ...
  • MongoDB聚合查询示例

    千次阅读 2018-04-11 14:56:29
    MongoDB聚合查询示例目的:统计book_order表的每个用户的order总数(total),以及失效的数量(invalid)查询用户信息DBRef(java代码中有查询,使用DBRef查询)mongodb语法示例:aggregate会一层一层查询db.book_...
  • Prometheus MongoDB查询导出器 ...对于kubernetes用户MongoDB查询导出器有一个正式的Helm图表。 请在阅读安装说明。 用法 $ mongodb_query_exporter 使用-help标志可获取帮助信息。 如果您使用MongoDB Authoriza
  • mongodb聚合查询

    千次阅读 2018-05-10 15:32:14
    比如查询用户每一天上传了哪些图片,最终返回结果是时间作为key值,value值是一个多张图片的数组。 简单的想的话可以先查询到用户上传的所有图片,然后前端再做数组便利,将这些图片分组。那再数据量很大的时候又该...
  • mongodb查询速度慢是什么原因?

    千次阅读 2015-03-26 10:37:38
    mongodb查询速度慢是什么原因? 2011-12-22 15:28:00 标签:休闲 mongodb 查询 慢 职场   mongodb查询速度慢是什么原因? 通过mongodb客户端samus代码研究解决问题 最近有项目需要用到mongodb,于是在...
  • 文章目录导入mongodb依赖 导入mongodb依赖 <!--mongodb依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-dat...
  • MongoDB查询优化

    2020-11-18 16:09:26
    一、MongoDB查询(Profiling)级别说明 0:关闭,不收集任何慢查询数据,默认为0 1:收集慢查询数据,默认是100毫秒 2:收集所有数据 1、开启和设置慢查询 ① 修改配置文件(mongo.conf)开启Profiling #开启慢查询...
  • java 操作mongodb查询条件设置

    千次阅读 2018-03-06 10:16:00
    java操作mongodb进行查询,常用筛选条件的设置如下:条件列表:BasicDBList condList = new BasicDBList();临时条件对象:BasicDBObject cond = null;DBCollection coll = db.getCollection("A");1、$...
  • 打印出大量的慢查询请求,集中在直接查询用户信息的user_config集合上面。 配置中心的请求分为两种,一种是全局统一数据,通过用户的不同APP版本,IMEI等信息范围相应数据的灰度版本控制,或者APP配置信息等数据,...
  • MongoDB查询分组并获取TopN数据

    千次阅读 2020-11-18 22:41:59
    MongoDB中使用$group、$project等运算符实现分组并获取各分组中Top N个元素。
  • 在Ubuntu下最傻瓜的步骤(以下都在root用户下进行操作): MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。 打开终端,输入以下命令: sudo apt-get install mongodb 2.这时装好以后应该...
  • mongodb查询计划(explain)分析

    千次阅读 2017-03-01 16:38:05
    环境mongodb:3.4 robomongo:1.0.RC1explain 返回的数据执行的语句:db.urlcontents.find({ir_urltitle:{$regex:"科技"}, ir_groupname:"产业热点" }).sort({ir_urltime:-1}).explain("queryPlanner")结果为:{ ...
  • MongoDB

    2021-02-20 20:00:07
    28个MongoDB经典面试题详解 更新时间:2020年02月09日 15:28:40 作者:罗阿红 这篇文章主要介绍了28个MongoDB经典面试题详解,需要的朋友可以参考下 MongoDB是目前最好的面向文档的免费开源NoSQL数据库。 如果...
  • mongodb

    2021-08-31 11:30:02
    什么是mongodb? mondgodb是由c++语言编写的,是一个基于分布式文件存储的开源数据库系统 在高负载的情况下,添加更多的节点,可以保证服务器新能 mongodb指在web应用的场景提供可扩展的搞性能数据存储解决方案 ...
  • MongoDB 地理空间查询

    2020-01-20 10:47:26
    MongoDB支持对地理空间数据的查询操作。本节介绍MongoDB的地理空间特性。 1.地理空间数据 在MongoDB中,可以将地理空间数据存储为GeoJSON对象或遗留坐标对。 1.1GeoJSON对象 要计算类地球体上的几何形状,请将...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,660
精华内容 17,064
关键字:

mongodb查询用户信息