2016-11-17 24 views
1

我試圖找到所有用戶除少數,像這樣:MongoDB中查找所有不在此數組中

// get special user IDs 
var special = db.special.find({}, { _id: 1 }).toArray(); 

// get all users except for the special ones 
var users = db.users.find({_id: {$nin: special}}); 

這不起作用,因爲我傳遞給$nin數組不的ObjectId和數組但{ _id: ObjectId() }

可變special數組看起來像這樣在第一次查詢後:

[ { _id: ObjectId(###) }, { _id: ObjectId(###) } ] 

$nin在第二查詢需要這樣的:

[ ObjectId(###), ObjectId(###) ] 

我怎樣才能得到公正的陣列中的ObjectId()第一個查詢,這樣我可以在第二個查詢使用它們?

或者,有沒有更好的方法來實現我想要做的事情?

+0

的可能的複製[查找用戶誰沒有邀請任何用戶(http://stackoverflow.com/questions/40626075/find-users-who-has-沒有被邀請的任何用戶) – styvane

回答

3

使用由find()函數返回的cursor.map()方法的{ _id: ObjectId(###) }文檔列表如下所示

var special = db.special.find({}, { _id: 1 }).map(function(doc){ 
    return doc._id; 
}); 

另一種方法轉換到ObjectId的數組你可以考慮在聚合中使用運算符$lookup框架在special集合上執行「左外連接」並過濾新「已連接」數組字段中的文檔。過濾器應該匹配數組字段爲空的文檔。

下面的例子說明了這一點:

db.users.aggregate([ 
    { 
     "$lookup": { 
      "from": "special", 
      "localField": "_id", 
      "foreignField": "_id", 
      "as": "specialUsers" // <-- this will produce an arry of "joined" docs 
     } 
    }, 
    { "$match": { "specialUsers.0": { "$exists": false } } } // <-- match on empty array 
]) 
+1

你應該返回doc._id或它不會工作:p – felix

+0

原來你甚至可以使用箭頭函數 - .map(doc => doc._id) – 17xande

+0

@felix感謝您注意typo – chridam

相關問題