2016-07-17 2 views
1

Это коллекция под названием test.MongoDB: как запросить документы с критериями `IS NOT (MAX())?

{ 
    {"_id": 1, "groupName": "A", lastModified: ISODate("2012-09-17T23:25:56.314Z")}, 
    {"_id": 2, "groupName": "A", lastModified: ISODate("2013-09-17T23:25:56.314Z")}, 
    {"_id": 3, "groupName": "A", lastModified: ISODate("2016-01-10T23:25:56.314Z")}, 
    {"_id": 4, "groupName": "B", lastModified: ISODate("2020-09-17T23:25:56.314Z")}, 
    {"_id": 5, "groupName": "B", lastModified: ISODate("2000-01-17T23:25:56.314Z")} 
} 

Я хочу запросить некоторые документы в этой коллекции, с этими критериями:

  1. которого groupName являются "А".
  2. которого lastModified является не наибольшим значением (ISODate("2016-01-10T23:25:56.314Z")) из lastModified полеев документов с "groupName": "A".

Таким образом, в этом случае, результат должен быть

{ 
    {"_id": 1, "groupName": "A", lastModified: ISODate("2012-09-17T23:25:56.314Z")}, 
    {"_id": 2, "groupName": "A", lastModified: ISODate("2013-09-17T23:25:56.314Z")} 
} 

Я использую Node.js с node-mongodb-native модулем. Могу ли я сделать это, не загружая и не повторяя все документы? Я имею в виду, могу ли я сделать это в БД?

ответ

2

Если вы определенно фильтруете groupName, этот простой запрос поможет вам достичь желаемого результата без значительных издержек.

db.test.find({groupName : "A"}).skip(1).sort({lastModifiedAt : -1})

Если у вас есть более сложный сценарий/группировки/однако вложенности, вам, возможно, придется использовать aggregate или mapReduce рамки.

+0

спасибо. Но кажется, что цель '.skip (1)' состоит в том, чтобы удалить самую страшную, поэтому должна быть форма _sort-before-skip_. Это не должно быть 'db.test.find ({groupName:" A "}). Sort ({lastModified: -1}). Skip (1)'? –

+1

Добро пожаловать. При написании запроса Mongo это не имеет значения. Mongo всегда будет выполнять 'sort', затем' skip', а затем 'limit'. Таким образом, ответ всегда имеет смысл. Попробуйте. –

+0

Спасибо! Это мне очень помогло! –

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