搜索

首页  >  问答  >  正文

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

数据的格式是这样的:

{
    "_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那个

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

ringa_leeringa_lee2801 天前1230

全部回复(3)我来回复

  • ringa_lee

    ringa_lee2017-04-24 09:14:57

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

    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看样子是唯一的,应该能满足你的需求。

    回复
    0
  • 迷茫

    迷茫2017-04-24 09:14:57

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

    db.demo.find({"albums.privilege":5, people_id:1}, {"albums":{$elemMatch:{privilege:5}}})
    

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-24 09:14:57

    你子文档id是自增的吗?

    回复
    0
  • 取消回复