Найдите объекты между двумя датами MongoDB

Сначала вы должны объявить x как массив:

public int[] x;

заметить, что стиль Java не int x[];
Затем внутри Square() Вы должны инициализировать x следующим образом:

x = new int[10];

Наконец, это:

(Math.pow(x[i] - 2.5, 2)) / (2 * (x[i] - 2.5))

возвращает double, поэтому вы должны привести его к int: [1121 ]

x[i+1] = x[i] - (int) ((Math.pow(x[i] - 2.5, 2)) / (2 * (x[i] - 2.5)));

Итак, ваш код должен быть:

public int[] x;
public void Square() {
    x = new int[10];
    x[0] = 7;
}
public void root() {
    if (x == null)
        Square();
    for(int i = 0; i < x.length - 1; i++) {
        x[i+1] = x[i] - (int) ((Math.pow(x[i] - 2.5, 2)) / (2 * (x[i] - 2.5)));
        System.out.println(x[i+1]);
    }
}

Внутри цикла вы обращаетесь к элементу i + 1, поэтому счетчик цикла должен принимать значения до x.length - 2, это почему у меня в коде: i < x.length - 1.
Я удалил объявление y из Square(), так как оно не используется.

363
задан royhowie 10 August 2015 в 21:20
поделиться

3 ответа

В

Querying for a Date Range (Specific Month or Day) в MongoDB Cookbook есть очень хорошее объяснение по этому вопросу, но ниже я попробовал кое-что сам, и, кажется, это работает.

items.save({
    name: "example",
    created_at: ISODate("2010-04-30T00:00:00.000Z")
})
items.find({
    created_at: {
        $gte: ISODate("2010-04-29T00:00:00.000Z"),
        $lt: ISODate("2010-05-01T00:00:00.000Z")
    }
})
=> { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" }

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

items.save({
    name: "example",
    created_at: "Sun May 30 18.49:00 +0000 2010"
})
items.find({
    created_at: {
        $gte:"Mon May 30 18:47:00 +0000 2015",
        $lt: "Sun May 30 20:40:36 +0000 2010"
    }
})
=> { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" }

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

560
ответ дан 23 November 2019 в 00:11
поделиться
mongoose.model('ModelName').aggregate([
    {
        $match: {
            userId: mongoose.Types.ObjectId(userId)
        }
    },
    {
        $project: {
            dataList: {
              $filter: {
                 input: "$dataList",
                 as: "item",
                 cond: { 
                    $and: [
                        {
                            $gte: [ "$item.dateTime", new Date(`2017-01-01T00:00:00.000Z`) ]
                        },
                        {
                            $lte: [ "$item.dateTime", new Date(`2019-12-01T00:00:00.000Z`) ]
                        },
                    ]
                 }
              }
           }
        }
     }
])
0
ответ дан 23 November 2019 в 00:11
поделиться

MongoDB фактически хранит миллис даты как int (64), как предписано http://bsonspec.org/#/specification

Однако он может получить довольно сбивает с толку, когда вы извлекаете даты, поскольку драйвер клиента создает экземпляр объекта даты с его собственным локальным часовым поясом. Драйвер JavaScript в консоли mongo обязательно сделает это.

Итак, если вы заботитесь о своих часовых поясах, убедитесь, что вы знаете, какими они должны быть, когда вы их вернете. Это не должно иметь большого значения для запросов, поскольку оно по-прежнему будет приравниваться к тому же int (64), независимо от того, в каком часовом поясе находится ваш объект даты (я надеюсь). Но я бы определенно сделал запросы с фактическими объектами даты (не строками) и позволил бы драйверу делать свое дело.

16
ответ дан 23 November 2019 в 00:11
поделиться
Другие вопросы по тегам:

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