2011-11-24 57 views
2

我試圖在mongo查詢中模擬一個連接,所以我把我的第一個查詢的結果,然後把它作爲一個$過濾器傳遞給我的第二個查詢。如何獲得一個值數組而不是一個在mongo/node/mongoose中的json數組?

不幸的是我的第一次查詢的結果返回JSON對象,像這樣

[ { _id: 4ecd830da046050100000025 }, 
    { _id: 4ecd84a0a046050100000085 } ] 

一個數組,因爲他們是JSON對象,而不是一個數值數組中過濾$不返回任何東西。我可以手動轉換那個數組,但有沒有內置的方法或函數可以使用?另外,有沒有一種方法可以讓mongo返回值數組呢?目前,我打電話查找查詢作爲這樣

Likes.find {liker:"Me"}, {_id:1}, {safe:true} 

這裏是我的第二個查詢

Post.find {_id:{$in:likes}} 

我希望這樣的事情

Post.find {_id:{$in:likes._id}} 

回答

3

雖然沒有通用的解決方案的在$ in子句的情況下可以使用不同操作的結果:

> db.test.save({a:1}) 
> db.test.save({a:2}) 
> db.test.save({a:3}) 
> db.test.save({a:4}) 

> ids = db.test.distinct("_id", {a:{$gt:2}}) 
[ 
     ObjectId("4ece45c2c951f11718678574"), 
     ObjectId("4ece45c4c951f11718678575") 
] 

> db.test.find({_id:{$in:ids}}) 
{ "_id" : ObjectId("4ece45c2c951f11718678574"), "a" : 3 } 
{ "_id" : ObjectId("4ece45c4c951f11718678575"), "a" : 4 } 

希望有所幫助!

+0

酷,這工作......這種技術在性能方面如何? mongo中的獨特查詢是否真實快速且快速? – MonkeyBonkey

+0

如果索引,他們是相對較快的是。由於不同操作的查詢子句顯着減少了候選集,因此它應該相對接近原始解決方案。不同的總是需要對候選集進行全面掃描,只要你保持相對較小的金牌即可。祝你好運。 –

+0

如果索引是唯一索引,那麼只需返回btree中的每個節點而不必檢查它們是否是唯一的,該操作可能會更快。 –

相關問題