如何在功能更新中结合$ slice和select返回键操作?

时间:2011-10-06 03:32:25

标签: mongodb

鉴于收集如下:

> 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" ] }

2 个答案:

答案 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(),就没有办法做到这一点。

来自 MongoDB权威指南:

除非另有说明,否则在使用“$ slice”时将返回文档中的所有键。 这与其他键说明符不同(例如: fruit:1 ),它会阻止返回未提及的键。