2012-09-13 72 views
5

我有一個數據庫集合(命名爲前方作戰點),象這樣:

{'followers': 
     { 
      '123':1 
      '123':2 
      '123':3 
     } 
} 

如果我運行查詢(使用pymongo):

cursor = fols.find() 
cursor.count() 
>>3 

工作正常。現在:

cursor = fols.find({'followers':{'123':1}}) 
cursor.count() 
>>1 

再次正常工作。但如果我嘗試:

cursor = fols.find({'followers':{'123':{'$exists': True}}}) 
cursor.count() 
>> 0 

即使有3條記錄,它也會返回0。

+1

你能否澄清一下:你有一個包含三個文件的追隨者集合:{'123':1},{'123':2},{'123':3}或者你有一個集合'fols '包含一個包含3個子文檔的文檔:{'followers':{'123':1},{'123':2},{'123':3}}?因爲他們的密鑰'123'將被覆蓋,只剩下一個副本。 – Thomas

+0

我有一個包含單個文檔「追隨者」,其中包含其他值的集合。我可以確認它沒有被覆蓋,就像我做的那樣:fols.find()。它會返回我所有的3個文件。 – Amitash

+1

如果你在fols集合中有單個文檔,那麼fols.find()應該只返回一個單獨的文檔,而不是3.我在mongo shell中試過這個:db.fols.insert({'followers':{'123 ':1,'123':2,'123':3}})和db.fols.find()取回{「_id」:ObjectId(「505149486195484752df6214」),「followers」:{「123」 3}}。 – Thomas

回答

19

當您不匹配完整的對象時,您需要使用dot notation來針對嵌入對象使用操作符。因此,在這種情況下:

cursor = fols.find({'followers.123':{'$exists': True}}) 
+1

這就像一個魅力。 – Amitash

5

嘗試點語法:

cursor = fols.find({'followers.123': {'$exists': True}}) 

還能看到我的上述評論。 (子)文檔中不能多次使用相同的密鑰。