我的收藏中有一条记录,我想获取身份证号为1的人的详细信息。但我得到的详细信息是2次而不是1次。
db.mycollection.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}, { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]})
然后运行
> db.mycollection.findOne({"person.id":1},{"person.details":1,"_id":0})
结果是:
{
"person" :
[
{
"details" :
{
"name" : "Aswini",
"Age" : 10
}
},
{
"details" :
{
"name" : "Mahesh",
"Age" : 11
}
}
]
}
但我需要如下:
{
"person" : [
{
"details" : {
"name" : "Aswini",
"Age" : 10
}
}
]
}
不明白哪里弄错了。请你帮忙。我正在使用MongoDB,Java
答案 0 :(得分:3)
这是过滤多级嵌入文档的行为,通常匹配过滤器会返回整个文档,而不是子集。
通常positional operator $
用于匹配updates
中的子文档。但该功能尚未在返回说明符中实现。
mongo Support for positional ($) operator in fields to return specifier已经存在一个悬而未决的问题。 (如果你真的需要这个功能,请登录投票)
所以你必须重新设计你的架构来处理这个问题,可能就像这样
db.test.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}]})
db.test.insert({"person" : [ { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]})
db.test.find({"person.id":1},{'person.details':1})
答案 1 :(得分:0)
person
是一个数组。如果你想获得这个数组的第一个元素,你应该使用$slice
db.mycollection.findOne({"person.id":1},{"person":{$slice:[0,1]},"_id":0})