鉴于收集如下:
> 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 }
我需要在find函数中结合{fruit:{$ slice:2}}和{fruit: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" ] }
答案 0 :(得分: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})
我找到了here的JIRA问题。看起来10gen员工想要这种行为。
答案 1 :(得分:1)
我认为如果没有在_id:0, _size:0
的第二个参数中明确包含find()
,就没有办法做到这一点。
除非另有说明,否则在使用“$ slice”时将返回文档中的所有键。 这与其他键说明符不同(例如: fruit:1 ),它会阻止返回未提及的键。