MongoDB常用操作学习与总结

快速导航

操作符介绍

  • $project包含、排除、重命名和显示字段

  • $match查询需要同find()一样的参数

  • $limit限制结果数量

  • $skip忽略结果的数量

  • $sort按照给定的字段排序结果

  • $group按照给定表达式组合结果

  • $unwind分割嵌入数组到自己顶层文件

正则模糊匹配

mongo语法下发如下:

db.collection.aggregate({"$match":{"name": /hello/i}})

Nodejs 两种写法:

  • collection.name = new RegExp('hello', 'i')

  • collection.name = {$regex: 'hello'}

mongodb高级查询

  • $gt 大于 (>)
db.user.find({"hours": {$gt: 80}})
  • $gte 大于等于 (>=)
{ "_id" : 1, "hours" : 80, "tasks" : 7 }
  • $lt 小于 (<)
> db.user.find({"hours": {$lt: 30}})
  • $lte 小于等于 (<=)
{ "_id" : 2, "hours" : 30, "tasks" : 9 }
  • $addToSet往数组中添加一个不重复的元素
> db.user.update({name: 'Jack'}, {$addToSet: {"email": "abc@qq.com"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  • $size数组元素个数查找email数组元素个数为2的数据结果集
> db.user.find({email: {$size: 2}})
{ "_id" : ObjectId("5bd1a85eca656270cb3c1405"), "name" : "Jack", "email" : [ "aaa@qq.com", "abc@qq.com" ] }
  • $in包含
> db.user.find({name: {$in: ['Jack']}})
{ "_id" : ObjectId("5bd1a85eca656270cb3c1405"), "name" : "Jack", "email" : [ "aaa@qq.com", "abc@qq.com" ] }
  • $nin在数组中不包含
 db.user.find({name: {$nin: ['Jack']}})
  • $ne 判断字段的值不等于!=
db.user.find({"name":{"$ne":"Jack"}})
  • $exists判断字段是否存在(true/false)
db.user.find({"name":{"$exists": true}})
  • $all匹配所有 {age: {"all": [7, 9]}} age数组中只要有7和9就满足条件。如果只有7没有9则不符合条
db.user.find({"name":{"$all":["Jack", "Tom"]}})
  • $mod取模运算

数据集合

{ "_id" : 1, "hours" : 80, "tasks" : 7 }
{ "_id" : 2, "hours" : 30, "tasks" : 9 }

使用聚合采用$mod表达式来对 $hours$tasks进行运算

db.user.aggregate([{$project: {fields: {$mod: ["$hours", "$tasks"]}}}])

update更新操作

MongoDB 对集合中 某个数组对象下的字段进行更新

例如使用update对集合中的orderNo为o111111字段下的userInfo数组对象下的cardNo等于123456789这个对象中的logs字段和status字段(在更新的时候没有status字段将会创建) 进行日志更新

{
	"_id" : ObjectId("59546c5051eb690367d457fa"),
	"orderNo" : "o111111"
	"userInfo" : [
		{
			"name" : "o1111",
			"cardNo" : "123456789",
			"logs" : [
				"2017-08-09 timeline ...",
		        "2017-08-10 timeline1 ...",
			]
		},
		{
			"name" : "o1111",
			"cardNo": "987654321",
			"logs": [
				"2017-08-09 timeline ...",
			]
		},
		...
	]
},
...
}
  • 在Nodejs中操作可以使用$push在找到logs数组后依次添加日志信息
let condition = {"orderNo":"o111111","userInfo.cardNo":"123456789"}

let update = {
	$push: {
		"passengers.$.logs": "2017-08-10 timeline1 ..."
	}
}
db.collections.findOneAndUpdate(condition, update, { returnOriginal: false })
  • 也可以使用$set 对某个字段进行更新
let condition = {"orderNo":"o111111","userInfo.cardNo":"123456789"}

let update = {
	$set: {"passengers.$.status": "已更新"}
}

DB.orderColl.updateOne(condition,update)

注意

需要注意的点是位置运算符$只能在查询中使用一次官方对于这个问题提出了一个方案Mongodb https://jira.mongodb.org/browse/SERVER-831 如果能在为未来发布这将是非常有用的。如果目前你需要在嵌套层次很深的情况下想对数组的内容进行修改可以采用forEach()方法操作像下面这样

db.post
  .find({"answers.comments.name": "jeff"})
  .forEach(function(post) {
    if (post.answers) {
      post.answers.forEach(function(answer) {
        if (answer.comments) {
          answer.comments.forEach(function(comment) {
            if (comment.name === "jeff") {
              comment.name = "joe";
            }
          });
        }
      });

      db.post.save(post);
    }
});

dbref数据引用

官方文档

https://docs.mongodb.com/manual/reference/database-references/#dbrefs

使用DBref

{ $ref : , $id : , $db :  }

三个字段意义:

  • $ref集合名称

  • $id引用的id

  • $db:数据库名称可选参数

数据库保存格式

{
   "_id":ObjectId("53402597d852426020000002"),
   "address": {
       "$ref": "address_home",
       "$id": ObjectId("534009e4d852427820000002"),
       "$db": "w3cschoolcc"
   },
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin"
}

查找

var user = db.users.findOne({"name":"Tom Benzamin"})
var dbRef = user.address

//如果dbRef是对象使用以下方式查找
db[dbRef.$ref].findOne({"_id":(dbRef.$id)})

插入

插入时注意$ref要放在$id之前否则会报错

    relatedFields: [
        {
            $ref: 'user', //指向的集合
            $id: ObjectId("5a72af0e937e6425bf4201e4"), //mongo生成的_id
            $db: 'demo', //数据库名 可选默认当前数据库如果为其他数据库的必传
        }
    ]
点赞