仅显示集合中的选择性列
{
"_id": ObjectId("52f4a5ed07b0f7106a9d5e4c"),
"FM_ID":"1253",
"passwd": ".aDoSkljf_h+6589q76w3rJK",
"Area": {
"0": {
"X": "53543500",
"Y": "14031500",
"images": {
"0": {
"ImgId": ObjectId("52f4a5a107b0f7106a9d1a84"),
"ImageType": NumberInt(15)
},
"1": {
"ImgId": ObjectId("52f4a5a107b0f7106a9d1a87"),
"ImageType": NumberInt(2)
}
}
},
"1": {
"X": "53543500",
"Y": "14094572",
"images": {
"0": {
"ImgId": ObjectId("52f4a5a107b0f7106a9d1aa8"),
"ImageType": NumberInt(15)
},
"1": {
"ImgId": ObjectId("52f4a5a107b0f7106a9d1aab"),
"ImageType": NumberInt(2)
}
}
},
"2": {
"X": "53480464",
"Y": "14031500",
"images": {
"0": {
"ImgId": ObjectId("52f4a5a107b0f7106a9d1acc"),
"ImageType": NumberInt(15)
}
}
}
}
}
我想只在集合中显示选择性数据
BasicDBObject有以下字段
B.append("FM_ID", 1);
B.append("_id", 1);
B.append("Area.$.$.images$.$.ImageType", 1);
我的要求是只显示FM_ID,_id和ImageType
答案 0 :(得分:0)
要获取字段的投影,您应该传递DBObject进行投影,
DBCursor cursor = collection.find(query, projectionQuery);
投影是键值对形式的DBObject。其中,
键是您要投影的字段的名称。值可以是0或1。 0 - 表示从结果集中排除特定列。 1 - 表示在结果集中包含特定列。
有关详细信息,请参阅here。
您可以使用投影查询中的“ elemMatch ”来限制从数组返回的字段。
了解更多info。
答案 1 :(得分:0)
首先,您的架构几乎肯定不是您希望能够以任何有意义的方式进行查询的。一切都在带有“伪数字”键的子文档中,这确实表明您确实需要数组并且执行想要它们。
所以,我会考虑其余的答案,你绝对改变了架构的格式,如下例所示。我在this post中解释了这个原因。
{
"_id": ObjectId("52f4a5ed07b0f7106a9d5e4c"),
"FM_ID":"1253",
"passwd": ".aDoSkljf_h+6589q76w3rJK",
"Area": [
{
"X": "53543500",
"Y": "14031500",
"images": [
{
"ImgId": ObjectId("52f4a5a107b0f7106a9d1a84"),
"ImageType": NumberInt(15)
},
{
"ImgId": ObjectId("52f4a5a107b0f7106a9d1a87"),
"ImageType": NumberInt(2)
}
]
},
{
"X": "53543500",
"Y": "14094572",
"images": [
{
"ImgId": ObjectId("52f4a5a107b0f7106a9d1aa8"),
"ImageType": NumberInt(15)
},
{
"ImgId": ObjectId("52f4a5a107b0f7106a9d1aab"),
"ImageType": NumberInt(2)
}
]
},
{
"X": "53480464",
"Y": "14031500",
"images": [
{
"ImgId": ObjectId("52f4a5a107b0f7106a9d1acc"),
"ImageType": NumberInt(15)
}
]
}
]
}
现在有了这个,我们可以做更多有意义的事情,正如另一个答案所述。但是对于这个,因为你还没有告诉我们更多,我们可以只检测你提到的三个字段(_id,FM_ID,ImageType)。
由于这不能在标准查询投影中完成,并且您可能希望匹配某些值,因此最好的方法是运行aggregation pipeline。这里有大量的Java文档(无论如何都只是DBObject),但这是标准的shell形式:
db.collection.aggregate([
{$unwind: "$Area" },
{$project: { FM_ID: 1, ImageType: "$Area.images.ImageType" }},
{$unwind: "$ImageType"}
])
通过这种方式,我们只能 您的响应中需要的三个字段。
如果您要查找文档结构中的特定条目,请查看$match管道运算符。