如何在mongodb中找到匹配的记录?

时间:2011-09-26 11:27:47

标签: java mongodb find

我的收藏中有一条记录,我想获取身份证号为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

2 个答案:

答案 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})