2014-05-22 4 views
2

У меня есть следующий объект User:MongoDB Limit поле и срез проекция вместе

{ 
    "_id" : ObjectId("someId"), 
    "name" : "Bob", 
    "password" : "fakePassword", 
    "follower" : [...], 
    "following" : [..] 
} 

мне нужно постраничный по списку повторителя, так что я использую оператор проектирования среза, но мне просто нужен список разбивается на страницах последователей возвращаться. И я не знаю, делаю ли я это неправильно, иначе это невозможно сделать, но предельные поля не работают с проекцией среза.

Ниже приведены несколько запросов я попробовал:

collection.findOne(
      { 
      _id: new ObjectId(userId) 
      }, 
      { 
      follower: {$slice:[skip, parseInt(pageSize)]}, 
      follower: 1 
      },.. 

и

collection.findOne(
      { 
      _id: new ObjectId(userId) 
      }, 
      { 
      follower: 1, 
      follower: {$slice:[skip, parseInt(pageSize)]} 
      }, 

Но это возвращает все значения в объекте, и не ограничивает поля, хотя, срез работ штраф в обоих случаях. Также, когда я делаю что-то вроде _id:0,following:0, эта часть работает, но я не хочу упоминать каждое поле в запросе вроде этого, это может создать проблемы, когда я решит изменить схему. Как я могу заставить это работать, что может быть синтаксисом запроса, чтобы заставить это работать .. ??

ответ

3

Не уверен, что я получаю ваш шаблон использования здесь. Возможно, мы немного упростим пример. Так, учитывая документ:

{ 
    "_id" : ObjectId("537dd763f95ddda3208798c5"), 
    "name" : "Bob", 
    "password" : "fakePassword", 
    "follower" : [ 
      "A", 
      "B", 
      "C", 
      "D", 
      "E", 
      "F", 
      "G", 
      "H", 
      "I", 
      "J", 
      "K" 
    ] 
} 

Так простой запрос, как это:

db.paging.find(
    { "name": "Bob" }, 
    { 
     "_id": 0, 
     "name": 0, 
     "password": 0, 
     "follower": { "$slice": [0,3] } 
}).pretty() 

дает результаты:

{ 
    "follower" : [ 
      "A", 
      "B", 
      "C" 
    ] 
} 

И так же со следующей страницы:

db.paging.find(
    { "name": "Bob" }, 
    { 
     "_id": 0, 
     "name": 0, 
     "password": 0, 
     "follower": { "$slice": [3,3] } 
}).pretty() 

дает результаты:

{ 
    "follower" : [ 
     "D", 
     "E", 
     "F" 
    ] 
} 

Так что для меня лично я не уверен, были ли вы спрашиваете об исключении поля или вы спрашивали о «подкачке» результатах массива, но так или иначе, оба из этих примеров показаны здесь.

+1

Так как в своем ответе, вы должны были определить все поля, которые нужны удалить, но в соответствии с MongoDB документов, вы можете также просто укажите поля, которые вам нужны, например 'followers: 1', поэтому это даст мне поле последователей и поле _id, и мне не нужно указывать все другие поля, которые мне не нужны. Мне нужно это для работы с оператором проекции среза. –

+2

@SambhavSharma Если это ваш реальный вопрос, я с радостью отправлю патч для документации (уже участник), но на самом деле это не работает. Вам нужно явно исключить все поля, которые вы не хотите использовать при использовании '$ slice'. Вы также не можете смешивать включение и исключение в '.find()', и если вам нужна эта сложность, вы используете ['.aggregate()'] (http://docs.mongodb.org/manual/reference/method/db. collection.aggregate /) с оператором [** '$ project' **] (http://docs.mongodb.org/manual/reference/operator/aggregation/project/). –

2

Одним из способов являются на самом деле использовать _id здесь, говоря {_id:1}:

{ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2"), "f" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20 ], "d" : 1 } 
> db.test.findOne({ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2")},{f:{$slice:[0,2]}}) 
{ 
     "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2"), 
     "f" : [ 
       1, 
       2 
     ], 
     "d" : 1 
} 
> db.test.findOne({ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2")},{_id:0, f:{$slice:[0,2]}}) 
{ "f" : [ 1, 2 ], "d" : 1 } 
> db.test.findOne({ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2")},{_id:1, f:{$slice:[0,2]}}) 
{ "_id" : ObjectId("537de1bc08eb9d89a7d3a1b2"), "f" : [ 1, 2 ] } 
+0

Я думаю, что это должно быть отмечено правильным ответом. Кроме того, если вы абсолютно не хотите _id, вы можете установить _id: 0 и some nonexistent_field: 1.Кажется маловероятным, что наличие _id в возвращаемом документе было бы проблемой. Еще кое-что; если вы разрезаете в поддоку, например sub_doc.my_array: {$ slice ...}, вам нужно выбрать несуществующее поле на этом уровне, например sub_doc.nonexistant_field: 1, чтобы предотвратить получение большего, чем только фрагмент – Keith

Смежные вопросы