我希望获得一些有关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_names
和email
字段,以首先标识用户,然后再确定给定的{{ 1}},以找到正确的嵌套数组对象。
我肯定会丢失一些东西,因为我才刚刚开始使用MongoDB,并且当我搜索类似的解决方案时,我并没有真正看到类似的东西。
不胜感激。
答案 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}]}
)