mongodb内嵌文档查找和修改问题

浏览:31日期:2023-07-11

问题描述

数据的格式是这样的:

{ '_id' : 1, 'people_id' : 1, 'albums' : [{ 'id' : 1, 'name' : '123', 'privilege' : 0,},{ 'id' : 2, 'name' : 'Q', 'privilege' : 5,},{ 'id' : 3, 'name' : 'Q', 'privilege' : 5,}, ]}{ '_id' : 2, 'people_id' : 2, 'albums' : [{ 'id' : 1, 'name' : '4', 'privilege' : 0,},{ 'id' : 2, 'name' : '5', 'privilege' : 0,} ]}

现在我想的是1 , 查询people_id 为 1 且 privilege 为 5的内嵌文档,mongodb的查询命令怎么写的啊

2,更新people_id 为 2 且权限为 id为2的内嵌文档的name字段值为 6,更新命令怎么写的啊

查询我用db.find({'people_id' : 1,'albums':{'$elemMatch' : {'privilege' : 5}}})来尝试匹配过,但是匹配出了:

{ '_id' : 1, 'people_id' : 1, 'albums' : [{ 'id' : 1, 'name' : '123', 'privilege' : 0,},{ 'id' : 2, 'name' : 'Q', 'privilege' : 5,},{ 'id' : 3, 'name' : 'Q', 'privilege' : 5,}, ]}

我并不想要id为1的那个,只想唯一匹配id为2和3那个

修改,我确实不会,还请大家帮忙提下解决方法,非常谢谢咯!

问题解答

回答1:

查询语句可以简化一下,如下:

db.demo.find({'people_id' : 1, 'albums.privilege': 5})

查询结果返回的是满足匹配条件的文档,虽然可以映射返回的字段,不过还真不能只返回你说的id为2和3的文档。不过既然已经得到了满足条件的json文档,可以写程序来获取想要的内嵌子文档吧。

更新语句如下:

db.demo.update({people_id:2, 'albums.id':2}, { $set : {'albums.$.name':6 }})

不过只是更新数组中第一个匹配的子文档,不过albums.id看样子是唯一的,应该能满足你的需求。

回答2:

关于#1是有解决方案的。 $elemMatch 同样可以用在find方法的第二个参数来限制返回数组内的元素。如下:

db.demo.find({'albums.privilege':5, people_id:1}, {'albums':{$elemMatch:{privilege:5}}})回答3:

你子文档id是自增的吗?

相关文章: