2015-12-28 46 views
0

我有一個帖子文件,像這樣MongoDB中查找基於對象

author: '828287', 
content: 'xyz', 
time: 88273622324 

的陣列和我的用戶文檔類似

id: '345678', 
name: 'John McClane', 
blocked: [{ 
    user: '123214', 
    time: 88273626362 
},{ 
    user: '345654', 
    time: 88273698678 
},{ 
    user: '554568', 
    time: 88273658858 
}], 
created: 127381283 

如何可以選擇所有被作家,其職位的用戶名不在我的blocked字段中?

編輯:此外,我如何選擇封鎖的作者的所有帖子,但只有當帖子的時間在塊的時間之前?這意味着阻止用戶只會阻止未來的帖子,現有的帖子不會受到影響。

+1

你能否證實了'的'POST'架構author'字段是否是'串'或'int'? – chridam

+0

帖子文檔的'author'字段是否應該與用戶文檔的'id'字段匹配? 'blocked [i] .user'的意義是什麼? – Sriram

+0

'author'字段是String。是的,發佈文檔的'author'字段等於發佈它的用戶的'id'字段。 'blocked'是一個帖子被阻止的用戶數組,因此我們不想選擇它們。 – JacobPariseau

回答

2

這應該工作

映射用戶的阻塞屬性(我假設你可以解析到一個數組):

var blockedUsers = user.blocked.map(function (b) { 
    return b.user; //if b.user is a number and author is a string then use return b.user.toString() instead 
}); 

查詢數據庫...

db.posts.find({author: {$nin: blockedUsers}}); 

編輯

試試這個爲你的編輯

var condition = user.blocked.map(function (b) { 
    var aux = { $and: [ { author: b.user }, { time: {$lt: b.time} } ] }; 
    return aux; 
}); 

var blockedUsers = user.blocked.map(function (b) { 
    return b.user; //if b.user is a number and author is a string then use return b.user.toString() instead 
}); 

condition.push({ author: {$nin: blockedUsers }}); 

db.posts.find({$or: condition }); 

變量condition最終看起來像這樣

[ 
    {$and: [ {author: "123214"}, {time: { $lt: 88273626362 } } ] }, 
    {$and: [ {author: "345654"}, {time: { $lt: 88273698678 } } ] }, 
    {$and: [ {author: "554568"}, {time: { $lt: 88273658858 } } ] }, 
    {author: {$nin: ["123214", "345654", "554568"] }} 
] 

這將幫助你理解查詢

+0

'blockedUsers'是一個整數數組,並且post集合中的author字段(根據OP提供的模式)是字符串類型的,因此查詢不會找到匹配項。 – chridam

+1

我假設這只是一個例子..但如果是這樣的話,我會建議在兩個地方規範化類型。在任何情況下,我都會編輯答案以包含該場景 – lascort

+0

對於我提出的問題,這是正確的,但這種解決方案不適合解決我未提及的下一步。我已經更新了第二部分的帖子。 – JacobPariseau