2016-02-26 48 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} 
) 

这可能比较慢,所以它可能值得的电话号码转换为字符串在数据库中,而不是做运行。