2016-04-15 66 views
1

我想寫一個簡單的Mongo查詢來返回字段的值爲空的所有文檔(或者是一個空數組,我不是確定你稱之爲)。如何查找字段的值爲空或空的所有文檔

這是我的查詢;

db.getCollection('contact').find({'poco.name.email':false})

下面是使用RoboMongo我收藏的截圖;

screenshot of my collection using RoboMongo

最後,我需要這個轉移到一些PHP。到目前爲止,我有這個工作;

$conditions = array_merge($conditions, [ 
    'owner.$id' => $this->getId(), 
    'poco.name.familyName' => "Smith", 
    //not sure what goes here.. something like 
    //'poco.emails' => null, 
]); 

return Model_Mongo_Contact::getContacts($conditions, $sort, $fields, $limit, $skip); 

這可能會是不困難的方法,更獲得回答..或者,也許不是我是很新的蒙戈它可能是真的很明顯。

+0

本文檔應該是有幫助的:https://docs.mongodb.org/manual/reference/operator/query/exists/ – Rajesh

+0

@Rajesh雖然['存在'](https://docs.mongodb.org/手動/引用/運算符/查詢/存在/)是在這裏使用的正確的東西,有一個具體的用法,它將實際檢測「既」一個空的數組以及任何不是數組或不存在。成爲'「poco.email.0」:{「$ exists」:false}',你在那裏尋找'0'索引位置。作爲一個「真實」的條件,數組存在並且「不空」,所以'false'自然反過來。這就是這裏給出的一個答案。 –

回答

0

我不是PHP的專家,但我會在蒙戈外殼爲做:

db.collection.find({ 
    $and: [ 
    {"poco.email":{$exists: true}}, 
    {"poco.email":{$ne: []}} 
    ]}) 

查詢上面會列出poco.name.email不丟失,不爲空的所有文件。

0

查找「空」數組或甚至「不存在」時的基本概念是使用「點符號」屬性並搜索數組索引不存在的位置。這可以通過使用$exists操作來實現:

$conditions = array_merge($conditions, [ 
    'owner.$id' => $this->getId(), 
    'poco.name.familyName' => "Smith", 
    'poco.emails.0' => array('$exists' => FALSE) 
]); 

時要麼沒有財產可言,或者說條件爲真,如果它是不是一個數組(因此沒有"0"字段屬性)以外的東西或者確實是一個「空「數組(因爲在第一個索引處沒有內容)。

當字段實際上被「編入索引」時,此功能效果最佳。因此,如果在「正常」結構中,數組元素中有「子文檔」,並且名稱爲"address"的一致字段的索引編號爲"poco.emails.address",那麼您最好指向該特定索引屬性以查看它是否爲$exists

$conditions = array_merge($conditions, [ 
    'owner.$id' => $this->getId(), 
    'poco.name.familyName' => "Smith", 
    'poco.emails.0.address' => array('$exists' => FALSE) 
]); 

但是如果陣列由純粹的唯一的「值」,沒有「子文件」,然後簡單地測試對於如最初證實將足以陣列的0索引位置。

相關問題