从嵌套数组MongoDB中检索和更新数组

时间:2018-10-26 11:36:16

标签: arrays node.js mongodb

我希望获得一些有关MongoDB中嵌套文档和数组查询的帮助,因为这是我的新手并遇到了障碍。

我有一个具有以下结构的文档,

{
"_id": {
    "$oid": "5bd0fdfebc54ef73c6b2c841"
},
"name": "Joe",
"email": "joe@test.com",
"password": "$2a$10$6piR5uuLqZxEXbazwHBw7egFYJwnwEs3AYdpJGvlW1/cu6CGj1f8a",
"shows": [
    2790,
    13,
    4,
    1850
],
"ep_info": [
    {
        "show_id": "169",
        "no_of_eps": "62",
        "watched_eps": "1",
        "watched_eps_names": [
            "Pilot"
        ]
    },
    {
        "show_id": 2790,
        "no_of_eps": 39,
        "watched_eps": 0,
        "watched_eps_names": []
    }

]}

我一直在尝试找出一种方法,该方法能够根据给定的watched_eps更新watched_eps_namesemail字段,以首先标识用户,然后再确定给定的{{ 1}},以找到正确的嵌套数组对象。

我肯定会丢失一些东西,因为我才刚刚开始使用MongoDB,并且当我搜索类似的解决方案时,我并没有真正看到类似的东西。

不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以使用以下查询:

db.getCollection('tests').update({
    "email":"joe@test.com", "ep_info.show_id" : "169"
},
{
    "$set": {"ep_info.$.watched_eps": 10, "ep_info.$.watched_eps_names" : ["Pilot", "abc", "def"]}
})

之前:

/* 1 */
{
    "_id" : ObjectId("5bd0fdfebc54ef73c6b2c841"),
    "name" : "Joe",
    "email" : "joe@test.com",
    "password" : "$2a$10$6piR5uuLqZxEXbazwHBw7egFYJwnwEs3AYdpJGvlW1/cu6CGj1f8a",
    "shows" : [ 
        2790, 
        13, 
        4, 
        1850
    ],
    "ep_info" : [ 
        {
            "show_id" : "169",
            "no_of_eps" : "62",
            "watched_eps" : "1",
            "watched_eps_names" : [ 
                "Pilot"
            ]
        }, 
        {
            "show_id" : 2790,
            "no_of_eps" : 39,
            "watched_eps" : 0,
            "watched_eps_names" : []
        }
    ]
}

更新后:

/* 1 */
{
    "_id" : ObjectId("5bd0fdfebc54ef73c6b2c841"),
    "name" : "Joe",
    "email" : "joe@test.com",
    "password" : "$2a$10$6piR5uuLqZxEXbazwHBw7egFYJwnwEs3AYdpJGvlW1/cu6CGj1f8a",
    "shows" : [ 
        2790, 
        13, 
        4, 
        1850
    ],
    "ep_info" : [ 
        {
            "show_id" : "169",
            "no_of_eps" : "62",
            "watched_eps" : 10.0,
            "watched_eps_names" : [ 
                "Pilot", 
                "abc", 
                "def"
            ]
        }, 
        {
            "show_id" : 2790,
            "no_of_eps" : 39,
            "watched_eps" : 0,
            "watched_eps_names" : []
        }
    ]
}

希望它对您有帮助。

答案 1 :(得分:0)

除了@Hardik Shah回答:

这将仅更新符合show_id条件的第一个数组元素。如果您可以在同一数组中更新多个元素,则必须使用positional filtered operator来匹配所有需要更新的数组元素。

这是一个例子:

db['01'].update(
  {"email": "joe@test.com"},
  {$set:{"ep_info.$[elem].watched_eps":10,"ep_info.$[elem].watched_eps_names":["a","b","c"]}},
  {arrayFilters:[{"elem.show_id":2790}]}
)