数据库

 首页 > 数据库 > MongoDB > 使用MongoDB数组元素的下标更新(update)多维数组

使用MongoDB数组元素的下标更新(update)多维数组

分享到:
【字体:
导读:
         摘要:mongodb的DBObject支持保存多维数组,在增加元素时使用$push操作符,在删除元素时使用$pull.但是在做更新时问题就来了,mongodb首先支持使用$来定位数组中的某个元素,例如:t.find(){_id:ObjectId(4b97e62bf1d8c7152c9ccb74),title:ABC,...

使用MongoDB数组元素的下标更新(update)多维数组

mongodb的DBObject支持保存多维数组,在增加元素时使用"$push"操作符,在删除元素时使用"$pull".

但是在做更新时问题就来了,mongodb首先支持使用"$"来定位数组中的某个元素,例如:

> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
"comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
"comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }
但是"$"操作符仅支持一维数组的定位,在更新多维数组时会返回错误信息,例如有如下数据结构:
{
"_id":ObjectId("4b97e62bf1d8c7152c9ccb74"),
”comments“:[
  {
  "by":"joe",
  "votes":3,
  "replies":[
              {"by":"jane",
              "votes":2
             }]
   }]
}
如果要将"replies"中{“by”:"jane"}的投票数增加1,该如何做呢(使用"$"mongodb会返回错误)?

mongodb使用多维数组下标的方式来定位某个元素,那么我们的方法就有了:

先find({"comments.replies.by":"jane"})来获取到整个object,然后计算相应reply的数组下标,再使用update({"comments.0.replies.0.by":"jane"},{"$inc",{"comments.0.replies.0.votes":1}}),即可,这样就没有同步的问题了。

ps:其实比较好的方法是由用户客户端程序来提供这个下标,即mongodb客户端不要到服务器获取这个多维数组再计算下标,效率太慢了。如果这个多维数组已经呈现给用户的话,那么完全可以由用户端的程序来提供这个下标,这样效率是很高的。

使用MongoDB数组元素的下标更新(update)多维数组
分享到:
Windows系统中以服务方式安装MongoDB数据...
Windows系统中以服务方式安装MongoDB数据库 观看本文之间,请先移步至下面纠正部分 之前按照MongoDB官网提供的安装方法一直出错 http://cn.docs.mongodb.org/master/tutorial/install-mongodb-on-windows/#mongodb-as-a-windows-service 错误主要如下: Mon Dec 24 10:57:41 Trying to start Windows service ...
PHP处理MongoDB的添加、修改、查询、删除...
PHP处理MongoDB的添加、修改、查询、删除等基础操作 使用下面的代码创建一个数据库链接 现在你可以使用$connection链接来操作数据库了 选择数据库 使用下面的代码来选择一个数据库 这里的数据库并不一定是一个已经存在的数据库,如果所选择的数据库不存在,则会新建一个数据库,所以在选择数据库的时候,...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……