我在mongoDB中有一个深度嵌套的文档,我想获取单个子对象.
例:
{
"schoolName": "Cool School",
"principal": "Joe Banks",
"rooms": [
{
"number": 100
"teacher": "Alvin Melvin"
"students": [
{
"name": "Bort"
"currentGrade": "A"
},
// ... many more students
]
},
// ... many more rooms
]
}
Run Code Online (Sandbox Code Playgroud)
最近Mongo更新为允许使用$ elemMatch投影进行1级深度子对象检索:
var projection = { _id: 0, rooms: { $elemMatch: { number: 100 } } };
db.schools.find({"schoolName": "Cool School"}, projection);
// returns { "rooms": [ /* array containing only the matching room */ ] }
Run Code Online (Sandbox Code Playgroud)
但当我尝试以同样的方式取一个学生(2级深)时,我收到一个错误:
var projection …Run Code Online (Sandbox Code Playgroud) 是否可以将位置运算符'$'与深层嵌套文档数组上的查询结合使用?
考虑以下定义'user'的嵌套文档:
{
username: 'test',
kingdoms: [
{
buildings: [
{
type: 'castle'
},
{
type: 'treasury'
},
...
]
},
...
]
}
Run Code Online (Sandbox Code Playgroud)
我们希望为特定用户返回"城堡",例如:
{
kingdoms: [{
buildings: [{
type: 'castle'
}]
}]
}
Run Code Online (Sandbox Code Playgroud)
因为你不能两次使用$运算符(https://jira.mongodb.org/browse/server-831)我知道我也不能查询某个特定的王国,所以我正在尝试写一个查找语句第n个王国.
这在更新深度嵌套的子文档(Mongodb更新深层嵌套的子文档)时似乎有意义,但我在查找查询方面的成功较少.
我可以通过查询返回第一个王国的建筑物:
db.users.findOne(
{ username: 'test' },
{ kingdoms: {$slice: [0, 1]}, 'kingdom.buildings': 1 }
);
Run Code Online (Sandbox Code Playgroud)
但这会归还那个王国的所有建筑物.
按照位置运算符的单级示例,我正在尝试这样的查询:
db.users.findOne(
{ username: 'test', 'kingdoms.buildings.type': 'castle' },
{ kingdoms: {$slice: [n, 1]}, 'kingdom.buildings.$': 1 }
);
Run Code Online (Sandbox Code Playgroud)
以形式:
db.collection.find( { <array.field>: …Run Code Online (Sandbox Code Playgroud) 我知道这个问题是重复的,但我不知道为什么我被卡住了
问题:
如何"requirement.$.update"使用 find by_id和requirement.update._id (如果需要requirement._id)编辑数组文档
// edit version number level2
exports.editVersionNumberPost = function(req, res){
var query = {
date: req.body.date,
number: req.body.number,
description: req.body.description
}
Project.findOneAndUpdate({ name: req.params.name,
"requirement._id" : req.params.versionID,
"requirement.update._id" : req.params.versionNumID},
{"$set":
{"requirement.$.update" : query
}
}, { new: true },
function(err, obj){})
};
Run Code Online (Sandbox Code Playgroud)
我的架构
----------------
namr: String
requirement:[{
version: Number,
update:[{
date: Date,
number: Number,
description: String
}]
}],
--------
Run Code Online (Sandbox Code Playgroud)