Показать последнее сообщение чата в Mongodb [duplicate]

Другой способ ответить на это, вместо того, чтобы увязнуть в тайных деталях точек последовательности и неопределенного поведения, - это просто спросить, , что они должны означать? Что было программистом пытаясь сделать?

Первый фрагмент, о котором спросили, i = i++ + ++i, в моей книге довольно сумасшедший. Никто никогда не напишет его в реальной программе, не очевидно, что он делает, нет никакого мыслимого алгоритма, который кто-то мог бы попытаться закодировать, что привело бы к этой конкретной надуманной последовательности операций. И поскольку для вас и меня не очевидно, что он должен делать, это прекрасно в моей книге, если компилятор не может понять, что он должен делать.

Второй фрагмент i = i++ , немного легче понять. Кто-то явно пытается увеличить i и присвоить результат i. Но есть несколько способов сделать это в C. Самый простой способ добавить 1 к i и присвоить результат обратно i, тот же почти для любого языка программирования:

i = i + 1

C , конечно, имеет удобный ярлык:

i++

Это означает, что «добавьте 1 к i и присвойте результат обратно i». Итак, если мы построим мешанину из двух, написав

i = i++

, то, что мы действительно говорим, это «добавить 1 к i» и присвоить результат обратно i, и присвоить результат обратно i ». Мы сбиты с толку, поэтому меня это слишком беспокоит, если компилятор тоже запутался.

Реально, единственный раз, когда эти сумасшедшие выражения получаются написанными, когда люди используют их как искусственные примеры того, как ++ должен работать. И, конечно же, важно понимать, как работает ++. Но одно практическое правило для использования ++: «Если не очевидно, что означает выражение, использующее ++, не пишите».

Мы проводили бесчисленные часы на comp.lang.c, обсуждая выражения, подобные этим, и , почему они не определены. Два моих более длинных ответа, которые пытаются объяснить, почему, заархивированы в Интернете:

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

9 ответов

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

Предполагая, что у вас есть поле 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);
545
ответ дан Justin Jenkins 26 August 2018 в 14:03
поделиться

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

Пример:

db.testcollection.find().limit(3).sort({timestamp:-1}); 
-4
ответ дан A-B-B 26 August 2018 в 14:03
поделиться

С этим запросом можно увидеть последние 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 26 August 2018 в 14:03
поделиться

@ 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 26 August 2018 в 14:03
поделиться

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

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

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

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

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

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 26 August 2018 в 14:03
поделиться

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

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

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

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

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

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

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

11
ответ дан rec 26 August 2018 в 14:03
поделиться

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

4
ответ дан Steve Wilhelm 26 August 2018 в 14:03
поделиться
Другие вопросы по тегам:

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