返回特定的mongodb嵌入文档
return specific mongodb embedded document
我想查询mongodb文档以返回特定的文档
假设我有下面的文档,并且我只想搜索给定房间的具体细节。比方说,我希望查询返回room_num=210的注释。我该怎么做?
我能够通过db.locations.findOne({"facility.room.room_num":room_num})进行查询;我不知道如何只投影房间。概括这个问题,我如何只投影嵌入的文档特定条目。
我的文档看起来是这样--->
{
_id: Object("xxx"),
name: "Campus",
facilities: [
{ name : "Science",
rooms : [
{
room_num: 210,
notes: "Chemistry Lab 1",
Dimension: "x*x"
},{
room_num: 120,
notes: "Chemistry Lab 2",
Dimension: "x*x"
}
]
},
{ name : "Arts",
rooms: [
{
room_num: 90,
notes: "Drawing 1",
Dimension: "x*x"
},{
room_num: 100,
notes: "Drawing 2",
Dimension: "x*x"
}
]
}
]
由于您有一个嵌入的数组(一个在另一个中),因此您确实可以使用聚合来实现这一点。你只需要做一个"双重"放卷操作:
db.collection.aggregate([
{ "$unwind": "$facilities" },
{ "$unwind": "$facilities.rooms" },
{ "$match": { "facilities.rooms.room_num": 210 } }
])
如果你真的想让它看起来像原始文档,那就更进一步:
db.collection.aggregate([
{ "$unwind": "$facilities" },
{ "$unwind": "$facilities.rooms" },
{ "$match": { "facilities.rooms.room_num": 210 } },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"facName": { "$first": "$facilities.name" },
"rooms": { "$push": "$facilities.rooms" }
}},
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"facities": { "$push": {
"name": "$facName" ,
"rooms": "$rooms"
}}
}}
])
因此,从你的数据来看,这将是一个结果:
{
"_id" : {
"0" : "x",
"1" : "x",
"2" : "x"
},
"name" : "Campus",
"facities" : [
{
"name" : "Science",
"rooms" : [
{
"room_num" : 210,
"notes" : "Chemistry Lab 1",
"Dimension" : "x*x"
}
]
}
]
}
或者最后,如果您只需要数组的内部房间部分,那么只需在末尾使用$project
语句,如第一个示例所示:
db.campus.aggregate([
{ "$unwind": "$facilities" },
{ "$unwind": "$facilities.rooms" },
{ "$match": { "facilities.rooms.room_num": 210 } },
{ "$project": {
"_id": 0,
"room_num": "$facilities.rooms.room_num",
"notes": "$facilities.rooms.notes",
"Dimension": "$facilities.rooms.Dimension"
}}
])
结果如下:
{ "room_num" : 210, "notes" : "Chemistry Lab 1", "Dimension" : "x*x" }
这应该会澄清问题。
尝试以下查询
db.locations.aggregate(
{ $unwind: "facilities.rooms" },
{ $match: { "facilities.rooms.room_num" : room_num}},
{ $project: { "facilities.rooms.notes" : 1 }}
)
您可以使用聚合框架。我相信$project和$unflow操作符正是您想要的。
db.rooms.aggregate([{
$project: {
_id: 0,
facilities: "$facilities.rooms.room_num"
}
}, {
$unwind: "$facilities"
}, {
$unwind: "$facilities"
}])
你会得到这样的东西:
{
"result" : [
{
"facilities" : 210
},
{
"facilities" : 120
},
{
"facilities" : 90
},
{
"facilities" : 100
}
],
"ok" : 1
}
相关文章:
- MongoDB (php) - 以数组而不是多个属性的形式返回文档属性
- 如何从多个不同的html页面获得mongodb文档的用户输入
- 如何在mongodb(mongose)中覆盖子文档的数组属性
- 如何获取文档数组中元素的计数-MongoDB
- 如何在MongoDB中检索子文档引用
- 如何在mongoDB中过滤子文档
- MongoDB/Mongoose-使用geoNear的聚合;子文档
- 将多级 mongodb 文档转换为 Backbone.js 模型/集合
- 收集订阅者的流星事件,用于在 mongodb 中新插入文档
- MongoDB 删除重复的子文档
- MongoDB findAndModify:>>>查找和更新文档数组中的对象
- 是否可以引用猫鼬(MongoDB)上的子文档
- 更新数组中的嵌入文档 - Mongodb + Node Driver
- 向文档 mongodb 添加新字段
- 如果文档不存在,如何创建文档MongoDB Javascript
- 导入BSON文档MongoDB时出错
- 更新数组从文档(MongoDB)在Javascript不工作
- Mapreduce与内部文档mongodb排序
- 省略子文档MongoDB中的某些结果
- 查询子文档MongoDB Node.JS