Как искать только новые данные в mongodb, используя pymongo [duplicate]

Добавлен ваш код

background-size: 250% 250%;

Пример

.slideToUnlock {
  background: linear-gradient(-90deg, black 0%, gray 40%, white 45%, gray 55%, black 60%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  color: transparent;
  -webkit-animation: slidetounlock 5s infinite;
  animation: slidetounlock 5s infinite;
  -webkit-animation-direction: normal;
  animation-direction: normal;
  background-size: 250% 250%;
}

https://jsfiddle.net/ekLamtbL/2/

402
задан Ripon Al Wasim 15 May 2013 в 13:11
поделиться

11 ответов

Если я понимаю ваш вопрос, вам нужно отсортировать его в порядке возрастания.

Предполагая, что у вас есть поле id или date, называемое «x», вы бы сделали ...

. sort ()


db.foo.find().sort({x:1});

1 будет сортировать по возрастанию (от старости до новейшего) и -1 будет сортировать нисходящий (самый новый до самого старого.)

Если вы используете авто созданное поле _id имеет встроенную в него дату ... поэтому вы можете использовать это для заказа ...

db.foo.find().sort({_id:1});

Это вернет все ваши документы, отсортированные от самых старых до новейших.

Натуральный порядок


Вы также можете использовать Природный порядок , упомянутый выше ...

db.foo.find().sort({$natural:1});

Опять же, используя 1 или -1 в зависимости от того, какой вы хотите.

Использовать .limit ()


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

db.foo.find().sort({_id:1}).limit(50);

, либо

db.foo.find().sort({$natural:1}).limit(50);
544
ответ дан Justin Jenkins 18 August 2018 в 20:13
поделиться
  • 1
    @MortezaM. Я уверен, что ваш запрос был смешанным ... ваш sort () должен быть запущен последним, а не первым (как SQL ORDER BY) .find ({}). Skip (1) .limit (50) .sort ({& Quot; дата & Quot;: - 1}) – Justin Jenkins 6 March 2012 в 21:11
  • 2
    Как бы то ни было, порядок вызова функций не должен иметь ничего общего с конечным результатом. – Morteza Milani 9 March 2012 в 11:21
  • 3
    @MortezaM. Конечно, порядок имеет значение. item = 3; item.add(3).divide(3) == 2; item.divide(3).add(3) == 4; Без заказа какой будет результат ??? Я согласен с вами в том, что этот обратный порядок не является интуитивным. Это не SQL, поскольку он должен следовать нормальным парадигмам OO. – RickyA 17 February 2013 в 16:25
  • 4
    и все же порядок НЕ имеет значения. Все, что вам нужно сделать, это попытаться понять, что это не так. все они вызываются на курсоре и передаются на сервер, поэтому сервер ограничивает результаты сортировки (верхний N), поскольку что-либо еще не имеет смысла. – Asya Kamsky 12 May 2013 в 16:42
  • 5
    Документы подтверждают, что порядок не имеет значения: link – JohnnyHK 7 July 2013 в 05:08

Последняя функция должна быть sort, а не limit.

Пример:

db.testcollection.find().limit(3).sort({timestamp:-1}); 
-4
ответ дан A-B-B 18 August 2018 в 20:13
поделиться
  • 1
    Это кажется неправильным. Зачем sort быть после limit? – A-B-B 19 July 2017 в 14:04

С этим запросом можно увидеть последние N добавленных записей: от менее недавних до самых последних:

db.collection.find().skip(db.collection.count() - N)

Если вы хотите их в обратном порядке:

db.collection.find().sort({ $natural: -1 }).limit(N)

Если вы установите Mongo-Hacker , вы также можете использовать:

db.collection.find().reverse().limit(N)

Если вы устали писать эти команды все время, вы можете создавать пользовательские функции в ~ / .mongorc.js. Например,

function last(N) {
    return db.collection.find().skip(db.collection.count() - N);
}

, затем из оболочки mongo просто введите last(N)

86
ответ дан JakeGould 18 August 2018 в 20:13
поделиться
  • 1
    db.collection.find().reverse().limit(1) дает мне ошибку ... has no method reverse – Catfish 9 May 2014 в 19:48
  • 2
    @Catfish вы правы, я только заметил, что reverse () был добавлен [Mongo-Hacker] ( tylerbrock.github.com/mongo-hacker ), я обновлю свой ответ. Благодарю. – Trasplazio Garzuglio 9 May 2014 в 20:27
  • 3
    db.getCollection ('COLLECTION_NAME'). find (). skip (db.getCollection ('COLLECTION_NAME'). count () - N) отлично работает для меня :) – Spl2nky 24 July 2016 в 17:01
  • 4
    Это должен быть ответ на вопрос, а не ответ Джастина Дженкинса. – Jadiel de Armas 5 September 2016 в 20:22
  • 5
    Натуральный порядок должен быть not ; если вы используете набор реплик (и вы должны быть), разные узлы могут иметь одинаковые документы, хранящиеся в другом порядке на диске. – Vince Bowdren 10 February 2017 в 17:46

@ bin-chen,

Вы можете использовать агрегацию для последних n записей подмножества документов в коллекции. Ниже приведен упрощенный пример без группировки (который вы делали бы между этапами 4 и 5 в этом случае).

Это возвращает последние 20 записей (на основе поля под названием «timestamp»), отсортированного по возрастанию. Затем он проектирует каждый документ _id, timestamp и whatever_field_you_want_to_show в результаты.

var pipeline = [
        {
            "$match": { //stage 1: filter out a subset
                "first_field": "needs to have this value",
                "second_field": "needs to be this"
            }
        },
        {
            "$sort": { //stage 2: sort the remainder last-first
                "timestamp": -1
            }
        },
        {
            "$limit": 20 //stage 3: keep only 20 of the descending order subset
        },
        {
            "$sort": {
                "rt": 1 //stage 4: sort back to ascending order
            }
        },
        {
            "$project": { //stage 5: add any fields you want to show in your results
                "_id": 1,
                "timestamp" : 1,
                "whatever_field_you_want_to_show": 1
            }
        }
    ]

yourcollection.aggregate(pipeline, function resultCallBack(err, result) {
  // account for (err)
  // do something with (result)
}

, поэтому результат будет выглядеть примерно так:

{ 
    "_id" : ObjectId("5ac5b878a1deg18asdafb060"),
    "timestamp" : "2018-04-05T05:47:37.045Z",
    "whatever_field_you_want_to_show" : -3.46000003814697
}
{ 
    "_id" : ObjectId("5ac5b878a1de1adsweafb05f"),
    "timestamp" : "2018-04-05T05:47:38.187Z",
    "whatever_field_you_want_to_show" : -4.13000011444092
}

Надеюсь, что это поможет.

1
ответ дан lauri108 18 August 2018 в 20:13
поделиться
  • 1
    СПАСИБО @ lauri108! Из всех ответов на этот и связанные вопросы, это ТОЛЬКО работающее и надежное решение «как получить ПОСЛЕДНИЕ N DOCS». И достаточно просто сделать в одном запросе. Работа выполнена. – randomsock 25 April 2018 в 11:34

Возможно, вы захотите использовать опции find: http://docs.meteor.com/api/collections.html#Mongo-Collection-find

db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
2
ответ дан Lucbug 18 August 2018 в 20:13
поделиться

Вы не можете «пропустить» в зависимости от размера коллекции, потому что она не будет учитывать условия запроса.

Правильное решение состоит в сортировке с нужной конечной точки, ограничение размер набора результатов, затем при необходимости отрегулируйте порядок результатов.

Вот пример, основанный на реальном коде.

var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N);

query.exec(function(err, results) {
    if (err) { 
    }
    else if (results.length == 0) {
    }
    else {
        results.reverse(); // put the results into the desired order
        results.forEach(function(result) {
            // do something with each result
        });
    }
});
5
ответ дан Marty Hirsch 18 August 2018 в 20:13
поделиться
  • 1
    Хороший обходной путь! Было бы неплохо иметь возможность делать то же самое на уровне запросов. Что-то вроде var query = collection.find( { conditions } ).sort({$natural : -1}).reverse().limit(N). – inwpitrust 24 January 2015 в 21:52

вы можете использовать sort(), limit(), skip(), чтобы получить последний запуск N записей из любого пропущенного значения

db.collections.find().sort(key:value).limit(int value).skip(some int value);
5
ответ дан Praveen 18 August 2018 в 20:13
поделиться

Чтобы получить последние N записей, вы можете выполнить следующий запрос:

db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)

, если вы хотите только одну последнюю запись:

db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})

Примечание: вместо $ Естественно, вы можете использовать один из столбцов из вашей коллекции.

11
ответ дан rec 18 August 2018 в 20:13
поделиться
  • 1
    это работает для меня db.collectionname.findOne ({$ query: {}, $ orderby: {$ natural: -1}}). Я думаю, что в круглых скобках отсутствует ответ – ajay 15 August 2015 в 13:07
  • 2
    Натуральный порядок должен быть not ; если вы используете набор реплик (и вы должны быть), разные узлы могут иметь одинаковые документы, хранящиеся в другом порядке на диске. – Vince Bowdren 10 February 2017 в 17:46

Посмотрите на запрос: Сортировка и естественный порядок, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order , а также sort () в методах курсора http://www.mongodb.org/display/DOCS/Advanced+Queries

4
ответ дан Steve Wilhelm 18 August 2018 в 20:13
поделиться
  • 1
    Спасибо за ваш ответ, это близко, но я хочу отставку записей, заказанных от менее недавних до самых последних, возможно ли это? – Bin Chen 12 December 2010 в 11:43
  • 2
    Натуральный порядок должен быть not ; если вы используете набор реплик (и вы должны быть), разные узлы могут иметь одинаковые документы, хранящиеся в другом порядке на диске. – Vince Bowdren 10 February 2017 в 17:46
  • 3
    Если вы хотите получить самые последние записи, вам придется полагаться на поле даты в документе. – Vince Bowdren 10 February 2017 в 17:47
0
ответ дан Gili.il 30 October 2018 в 08:28
поделиться
0
ответ дан KARTHIKEYAN.A 30 October 2018 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: