2016-02-26 51 views
0

我已經給了一個名爲votes在此基礎上設計包含文件收集閱讀:

{ 
    "_id" : ObjectId("56c000000000000001"), 
    "timestamp" : 1456441690, 
    "filename" : "42598295724057245724579", 
    "phoneNumber" : 49123456789, 
    "phoneNumberVotes" : [ 
     49123456783, 
     49123456784 
    ] 
} 

phoneNumberVotes陣列可以是空的。

我試圖執行此查詢:

db.getCollection('votes').find 
(
    { 
     $and:[ 
      { phoneNumber: { $ne: 49123456789}}, 
      { phoneNumber: { $nin: phoneNumberVotes }} 
     ] 
    }, 
    { timestamp: 1, filename: 1, phoneNumber: 1, phoneNumberVotes: 1} 
) 

但是,這是行不通的。當我嘗試「手動」創建工作例如: - 在查詢中的數組

db.getCollection('votes').find 
(
    { 
     $and:[ 
      { phoneNumber: { $ne: 49123456789}}, 
      { phoneNumber: { $nin: [49123456783,49123456784] }} 
     ] 
    }, 
    { timestamp: 1, filename: 1, phoneNumber: 1, phoneNumberVotes: 1} 
) 

有什麼不對我嘗試使用方法?謝謝你的幫助!

回答

2

您無法直接比較字段。 <field>Documentation之間的差異是<value>

你的情況,你需要使用$where操作執行JavaScript:

db.votes.find 
(
    { 
     phoneNumberVotes:{$exists:true}, 
     phoneNumber:{$exists:true, $ne:"49123456789"}, 
     $where: 'this.phoneNumberVotes.indexOf(this.phoneNumber) < 0' 
    }, 
    { timestamp: 1, filename: 1, phoneNumber: 1, phoneNumberVotes: 1} 
) 

它與標量值。

您正在使用的號碼是NumberLong。還有就是對象比較相關的old bug,所以你需要的電話號碼轉換爲字符串:

db.votes.find 
(
    { 
     phoneNumberVotes:{$exists:true}, 
     phoneNumber:{$exists:true, $ne:49123456789}, 
     $where: 'this.phoneNumberVotes.map(function(n){return n + ""}).indexOf(this.phoneNumber + "") < 0' 
    }, 
    { timestamp: 1, filename: 1, phoneNumber: 1, phoneNumberVotes: 1} 
) 

這可能比較慢,所以它可能值得的電話號碼轉換爲字符串在數據庫中,而不是做運行。