2014-06-21 57 views
1

我跑以下蒙戈查詢:對下列文件蒙戈聚集給無意義的結果

db.docs.aggregate([ 
    {'$group': { 
     '_id': 1,   
     'total_neg_sent_count': {'$sum': {'$cond': [{'$lt': ['$s', 0]}, 1, 0]}} 
    }} 
]) 

/* 0 */ 
{ 
    "_id" : ObjectId("53a5c8f13f35b7fc1280c60a"), 
    "rT" : 5 
} 

/* 1 */ 
{ 
    "_id" : ObjectId("53a5c8f13f35b7fc1280c60b"), 
    "abc" : 1 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("53a5c8f13f35b7fc1280c60c"), 
    "rT" : 0 
} 

答案出人意料:

{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "total_neg_sent_count" : 3 
     } 
    ], 
    "ok" : 1 
} 

我不我不知道孟戈在這裏幹什麼。它應該返回'0',因爲所有文檔中都缺少's'。

+0

在這裏你還不明白的答案裏有東西嗎? –

回答

0

這是沒有這樣做是你認爲什麼是缺失的領域實際上的計算結果爲null0被認爲是「小於」此值:

db.docs.aggregate([{ "$project": { "s": { "$ifNull": [ "$s", null ] }} }]) 

顯示了這些評價爲null和再考慮這個,你的邏輯的原始部分:

db.docs.aggregate([{ "$project": { "s": { "$lt": [ "$s", 0 ] }} }]) 

,則表明該條件評估,以true和refore返回您的$cond聲明中的第一個值。因此,爲了考慮缺少的字段,你會使用$ifNull值正如前面所示:

db.docs.aggregate([ 
    { "$group": { 
     "_id": 1,   
     "total_neg_sent_count": { 
      "$sum": { 
       "$cond": [ {"$lt": [ {"$ifNull": [ "$s", 0 ] }, 0] }, 1, 0 ] 
      } 
     } 
    }} 
]) 

當該字段從文檔丟失,則會從$ifNull返回的值將是0,這當然是不$lt 0並返回您的預期值。