0

我有一个包含许多文档的 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"
    }
]

}

4

2 回答 2

2

你不能用简单的find做到这一点,但你可以使用聚合框架:

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}).pretty()

于 2013-06-21T18:06:06.847 回答
2

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

由于这是一个您只想从中获取单个匹配元素的数组,因此您需要使用$elemMatch投影运算符

既然这是你的作业,我将把它留给你来构建实际find,因为你知道它应该如何完成。

于 2013-06-22T03:53:53.717 回答