是否可以将位置运算符“$”与深度嵌套文档数组的查询结合使用?
考虑以下定义“用户”的嵌套文档:
{
username: 'test',
kingdoms: [
{
buildings: [
{
type: 'castle'
},
{
type: 'treasury'
},
...
]
},
...
]
}
我们想为特定用户返回“城堡”,例如以以下形式:
{
kingdoms: [{
buildings: [{
type: 'castle'
}]
}]
}
因为您不能两次使用 $ 运算符(https://jira.mongodb.org/browse/server-831)我知道我也不能查询特定的王国,所以我正在尝试为第n个王国。
在更新深度嵌套的子文档( Mongodb update deep 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 中所述。小号
但是,这失败并出现错误:
Positional operator does not match the query specifier
大概是因为 Kingdoms.buildings 不被视为数组。我也尝试过Kingdoms.0.buildings
令人困惑,因为这似乎适用于更新(根据Mongodb update deep nested subdocument)
我只是语法错误还是不支持?如果是这样,有没有办法实现类似的目标?