【发布时间】:2014-12-27 21:07:41
【问题描述】:
是否可以将位置运算符“$”与深度嵌套文档数组的查询结合使用?
考虑以下定义“用户”的嵌套文档:
{
username: 'test',
kingdoms: [
{
buildings: [
{
type: 'castle'
},
{
type: 'treasury'
},
...
]
},
...
]
}
我们想为特定用户返回“城堡”,例如形式:
{
kingdoms: [{
buildings: [{
type: 'castle'
}]
}]
}
因为你不能使用 $ 运算符两次 (https://jira.mongodb.org/browse/server-831) 我知道我也不能查询特定的王国,所以我正在尝试为第 n 个王国编写查找语句。
在更新深度嵌套的子文档 (Mongodb update deeply nested subdocument) 时,这似乎是有道理的,但我在查找查询方面的成功率较低。
我可以通过查询返回第一个王国的建筑:
db.users.findOne(
{ username: 'test' },
{ kingdoms: {$slice: [0, 1]}, 'kingdom.buildings': 1 }
);
但这会返回该王国的所有建筑物。
按照位置运算符的单级示例,我正在尝试这样的查询:
db.users.findOne(
{ username: 'test', 'kingdoms.buildings.type': 'castle' },
{ kingdoms: {$slice: [n, 1]}, 'kingdom.buildings.$': 1 }
);
这样的形式:
db.collection.find( { <array.field>: <value> ...}, { "<array>.$": 1 } )
如文档http://docs.mongodb.org/manual/reference/operator/projection/positional/#proj.S中所述
但是这失败并出现错误:
Positional operator does not match the query specifier
大概是因为 Kingdoms.buildings 不被视为一个数组。我也试过 kingdoms.0.buildings
这令人困惑,因为这似乎适用于更新(根据Mongodb update deeply nested subdocument)
是我的语法错误还是不支持?如果是这样,有没有办法实现类似的目标?
【问题讨论】:
标签: mongodb nested positional-operator