我有一个包含许多文档的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"
}
]
}
答案 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
,因为你知道它应该如何完成。