Как совместить как $ slice, так и операцию выбора возвращаемых клавиш в обновлении функции? - PullRequest
1 голос
/ 06 октября 2011

Учитывая коллекцию следующим образом:

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

Мне нужно объединить {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 ]

3 голосов
/ 06 октября 2011

К сожалению, функция, которую вы ищете, не будет работать.

Вы говорите, что хотите и фруктовое поле, и кусок фруктового поля. { 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 для этого здесь . Похоже, что сотрудники 10gen хотят такого поведения.

1 голос
/ 06 октября 2011

Я думаю, что нет такого способа сделать это без явного включения _id:0, _size:0 во 2-й аргумент для find().

из MongoDB Definitive Guide:

Если не указано иное, все ключи в документе возвращаются при использовании «$ slice».Это отличается от других спецификаторов ключей (например: fruit: 1 ), которые не позволяют возвращать не упомянутые ключи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...