Запросить массив в MongoDB - PullRequest
       4

Запросить массив в MongoDB

0 голосов
/ 29 января 2020

У меня есть эта коллекция в MongoDB:

{ 
    "_id" : ObjectId("5df013b10a88910018267a89"), 
    "StockNo" : "33598", 
    "Description" : "some description", 
    "detections" : [
        {
            "lastDetectedOn" : ISODate("2020-01-29T04:36:41.191+0000"), 
            "lastDetectedBy" : "comp-t", 
            "_id" : ObjectId("5e3135f68c9e930017de8aec")
        }, 
        {
            "lastDetectedOn" : ISODate("2019-12-21T18:12:06.571+0000"), 
            "lastDetectedBy" : "comp-n", 
            "_id" : ObjectId("5e3135f68c9e930017de8ae9")
        }, 
        {
            "lastDetectedOn" : ISODate("2020-01-29T07:36:06.910+0000"), 
            "lastDetectedBy" : "comp-a", 
            "_id" : ObjectId("5e3135f68c9e930017de8ae7")
        }
    ], 
    "createdAt" : ISODate("2019-12-10T21:52:49.788+0000"), 
    "updatedAt" : ISODate("2020-01-29T07:36:22.950+0000"), 
    "__v" : NumberInt(0)
}

Я хочу выполнить поиск по StockNo и получить имя компьютера, который последний раз его обнаружил (lastDetectedBy), только если lastDetectedOn был за последние 5 минут с Mon goose in node.js с Express.

У меня также есть эта коллекция:

{ 
    "_id" : ObjectId("5df113b10d35670018267a89"), 
    "InvoiceNo" : "1", 
    "InvoiceDate" : ISODate("2020-01-14T02:18:11.196+0000"),
    "InvoiceContact : "",
    "isActive" : true
},
{ 
    "_id" : ObjectId("5df013c90a88910018267a8a"), 
    "InvoiceNo" : "2", 
    "InvoiceDate" : ISODate("2020-01-14T02:18:44.279+0000"),
    "InvoiceContact : "Bob Smith",
    "isActive" : true
},
{ 
    "_id" : ObjectId("5e3096bb8c9e930017dc6e20"), 
    "InvoiceNo" : "3", 
    "InvoiceDate" : ISODate("2020-01-14T02:19:50.155+0000"),
    "InvoiceContact : "",
    "isActive" : true
}

И я хочу обновить все документы с пустым InvoiceContact, который был выпущен в последние 30 секунд (или любой диапазон дат между настоящим моментом и когда-то в прошлом), когда isActive равно true, а isActive равно false. Так, например, первая запись была выпущена за последние 30 секунд без InvoiceContact, и isActive имеет значение true, поэтому его необходимо обновить, но следующие две записи останутся нетронутыми по разным причинам, вторая запись имеет InvoiceContact, а третья запись вышла из диапазон.

1 Ответ

0 голосов
/ 30 января 2020

Первая часть

 var mins5 = new Date(ISODate() - 1000* 60 * 5 )

 db.getCollection('user').find({$and:[
     { "StockNo":"33598"},
     {"detections.lastDetectedOn" : { $gte : mins5 }}
     ]})
     .map(function(list){
         var results = [];
         list.detections.forEach(function (detections){
             if(detections.lastDetectedOn > mins5){
                 results.push(detections.lastDetectedBy);
             }
         })
         return results;
     });

Вторая часть может быть решена с помощью аналогичного запроса с использованием обновления вместо поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...