我可以通过查找条件获取mongo文档的一部分吗?

时间:2013-06-21 15:48:10

标签: mongodb

我有一个包含许多文档的foo集合。 例如:

{
"_id" : ObjectId("51c46dc75d1e56f582940c9c"),
"name" : "John",
"age" : 25,
"address" : {
    "city" : "New York",
    "postalCode" : "10021"
},
"phones" : [
    {
        "phone" : "212-555-1234",
        "type" : "home"
    },
    {
        "phone" : "646-555-1234",
        "type" : "mobile"
    }
]

}

我可以在手机阵列中找不到所有手机的文件吗?例如 - mongo返回带有phones.type =“mobile”的文档。我想要没有包含“家庭”型电话的John的文件吗?

{
"_id" : ObjectId("51c46dc75d1e56f582940c9c"),
"name" : "John",
"age" : 25,
"address" : {
    "city" : "New York",
    "postalCode" : "10021"
},
"phones" : [
    {
        "phone" : "646-555-1234",
        "type" : "mobile"
    }
]

}

2 个答案:

答案 0 :(得分:2)

您无法通过简单的查找执行此操作,但您可以使用聚合框架:

db.<coll>.aggregate({$match:{"name" : "John"}}, {$unwind:"$phones"}, {$match:{"phones.type":'mobile'}})

其中 是您的手机收藏

<强> UPD

感谢@ asya-kamsky获取信息。这是 $ elemMatch 的版本,但我不想偷你自己思考的机会。如果你完全迷失了这个问题,我做了一个剧透:

  

db..find({'name':'John'},{phones:{$ elemMatch:{“type”:“mobile”}},name:1,age:1,address:1})。漂亮()

答案 1 :(得分:2)

您可以在执行find时通过提供第二个参数(称为投影)来执行此操作 - 您可以在其中指定要返回的文档的哪些部分(字段)。这有点类似于SQL,您通常不会说SELECT *,而是枚举您实际想要返回的列。

由于这是一个您只想从中获取单个匹配元素的数组,因此您需要use the $elemMatch projection operator

由于这是你的作业,我会留给你构建实际的find,因为你知道它应该如何完成。