2011-10-06 19 views
1

鑑於集合,如下所示:

> db.food.find() 
{ "_id" : 1, "fruit" : [ "apple", "banana", "peach", "strawberry", "grape" ], "size" : 2 } 
{ "_id" : 2, "fruit" : [ "apple", "kumquat", "orange", "strawberry", "grape" ], "size" : 2 } 
{ "_id" : 3, "fruit" : [ "cherry", "banana", "apple", "strawberry", "grape" ], "size" : 2 } 

我需要結合{水果:{$切片:2}} {1}的水果中發現功能和。 這是我試過的,沒有一個按我期望的方式工作。

> db.food.find({}, {fruit : {$slice : 2}, fruit : 1, _id : 0}) 
{ "fruit" : [ "apple", "banana", "peach", "strawberry", "grape" ] } 
{ "fruit" : [ "apple", "kumquat", "orange", "strawberry", "grape" ] } 
{ "fruit" : [ "cherry", "banana", "apple", "strawberry", "grape" ] } 
This method ONLY works for {fruit : 1, _id : 0} 

> db.food.find({}, {fruit : 1, fruit : {$slice : 2}, _id : 0}) 
{ "fruit" : [ "apple", "banana" ], "size" : 2 } 
{ "fruit" : [ "apple", "kumquat" ], "size" : 2 } 
{ "fruit" : [ "cherry", "banana" ], "size" : 2 } 
This method ONLY works for {fruit : {$slice : 2}} 

> db.food.find({}, {$and : [{fruit : 1}, {fruit : {$slice : 1}}]}) 
{ "_id" : 1 } 
{ "_id" : 2 } 
{ "_id" : 3 } 

我甚至不知道爲什麼返回的結果是這樣的

要清楚,這裏就是我想:

{ "fruit" : [ "apple", "banana" ] } 
{ "fruit" : [ "apple", "kumquat" ] } 
{ "fruit" : [ "cherry", "banana" ] } 
+1

這裏有一個'黑客'在這裏工作:http://stackoverflow.com/a/15798087/1063287你指定一個虛擬字段返回,它以某種方式抑制除了你正在切片的字段'{'國家':{'$ slice':[0,3]},'_id':0,foo:1}' – user1063287

+0

這是一個可怕的,可怕的黑客攻擊。謝謝。 – Laizer

回答

3

不幸的是,該功能你」重新尋找將無法工作。

你是說你想要水果場和水果場的一部分。 { fruit: 1, fruit: {$slice : 2}但是,由於您擁有相同的密鑰兩次,所以會創建無效的JSON。

從你的例子中,它看起來像意圖是有水果,只有水果。不幸的是,只有兩個這樣的選項:

排除所有其他領域:

> db.food.find({}, {fruit : {$slice : 2}, _id : 0, size : 0, ...}) 

做一個權衡,也包括在返回的_id領域:

> db.food.find({}, {fruit : {$slice : 2}, _id : 1}) 

我發現JIRA問題爲這here。它看起來像10gen的工作人員想要這種行爲。

1

我認爲沒有明確包括在find()的第二個參數中這樣做的方法。

MongoDB的權威指南:

除非另有規定,當「$切片」用於文檔中的所有鍵返回。 這與其他密鑰說明符(例如:fruit:1)不同,它禁止未返回的密鑰被返回。

相關問題