MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Porównaj dwa pola daty w MongoDB

Nie można porównać pola z wartością innego pola z normalnym dopasowaniem zapytania. Możesz to jednak zrobić za pomocą struktury agregacji:

db.so.aggregate( [
    { $match: …your normal other query… },
    { $match: { $eq: [ '$modified', '$sync' ] } }
] );

Umieszczam tam… twoje normalne inne zapytanie… ponieważ możesz sprawić, by ten bit używał indeksu. Więc jeśli chcesz to zrobić tylko dla dokumentów, w których name pole to charles możesz zrobić:

db.so.ensureIndex( { name: 1 } );
db.so.aggregate( [
    { $match: { name: 'charles' } },
    { $project: { 
        modified: 1, 
        sync: 1,
        name: 1,
        eq: { $cond: [ { $gt: [ '$modified', '$sync' ] }, 1, 0 ] } 
    } },
    { $match: { eq: 1 } }
] );

Z wejściem:

{ "_id" : ObjectId("520276459bf0f0f3a6e4589c"), "modified" : 73845345, "sync" : 73234 }
{ "_id" : ObjectId("5202764f9bf0f0f3a6e4589d"), "modified" : 4, "sync" : 4 }
{ "_id" : ObjectId("5202765b9bf0f0f3a6e4589e"), "modified" : 4, "sync" : 4, "name" : "charles" }
{ "_id" : ObjectId("5202765e9bf0f0f3a6e4589f"), "modified" : 4, "sync" : 45, "name" : "charles" }
{ "_id" : ObjectId("520276949bf0f0f3a6e458a1"), "modified" : 46, "sync" : 45, "name" : "charles" }

To zwraca:

{
    "result" : [
        {
            "_id" : ObjectId("520276949bf0f0f3a6e458a1"),
            "modified" : 46,
            "sync" : 45,
            "name" : "charles",
            "eq" : 1
        }
    ],
    "ok" : 1
}

Jeśli chcesz więcej pól, musisz je dodać w $project .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Seryjne iterowanie po kursorze mongodb (oczekiwanie na wywołania zwrotne przed przejściem do następnego dokumentu)

  2. Jak rekurencyjnie odpytywać strukturę drzewa za pomocą MongoDB?

  3. Jak umieścić plik obrazu w obiekcie json?

  4. MongoDB $setDifference

  5. Zapytanie o daty za pomocą danych Mongo Spring vs konsoli Mongo (daty)