2014-03-14 110 views
3

一個文檔{"m":[1,2,3], "others":xxx}項目元件中,通過在獲得陣列的「m」的第一個元素:mongodb的陣列

db.find({query},{"m":{$slice:1}, "m":1}) 

返回的是{"m":[1]},在DOC的元件是一個數組。但是在這個查詢中,數組中只有一個元素會被獲取,所以我不需要返回doc包含只有一個元素的數組。這就像子查詢中的SQL局部變量。我想要的元素在原文檔沒有名字,如果我要得到它,然後我需要做一個名字對於它的文檔返回,我想是這樣的:{「所以LocalVariable」:1},而不是{「M」:1 ]}

我嘗試以伸出的第一要素:

db.find({query},{"m":{$slice:1}, "m.1":1}) 

但這不起作用。

+1

什麼是問號? –

+0

@jean我猜你的意思。你想要:「**數組的**第一**元素**,但**不**作爲數組值,** **只是**返回值?你不能這樣做,而不是用find。也許對於聚合,但我仍然懷疑這是你真正想要的,只是學會使用數組返回值,它是一個包含一個元素的數組,這不應該很難,你提出這個問題的方式顯然不是你真正的編碼使用情況下,你會做的更好請教一個問題,是關於** **實際代碼和問題,需要解決的問題。 –

+0

從JS API它確實是很難區分的。我使用C++的驅動程序,在這種情況下,代碼寫的很無聊每次我需要得到m個文檔,並將其轉換爲DOC的容器,並獲得第一個元素,然後將其轉換爲int值 – jean

回答

0

你似乎在尋找一個positional $操作者匹配。它的工作原理是這樣的:

db.collection.find({ m: 2 },{ "m.$": 1 }) 

,將返回你的匹配元素

如果你實際上希望總是獲得的第二個元素,那麼你就需要兩個參數形式$slice

db.collection.find({ },{ "m": { "$slice": [1,1] } }) 

測試輸出:

db.test.insert({ m: [1,2,3] }) 
db.test.find({ },{ "m": {$slice: [1,1]} }) 

    { "_id" : ObjectId("5323cc2770fde63cf1146ba3"), "m" : [ 2 ] } 
+0

回報仍然是{「M」:[1]}。 – jean

+0

@jean不,它不。看到我已經運行的輸出添加到答案 –

+0

我修改了我的問題Stion的。我希望它返回{「othername」:1}而不是{「m」:[1]}。我想投射出陣列中的元素 – jean