sql >> Database >  >> NoSQL >> MongoDB

Vergelijk twee datumvelden in MongoDB

Je kunt een veld niet vergelijken met de waarde van een ander veld met de normale zoekopdracht. U kunt dit echter doen met het aggregatieraamwerk:

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

Ik heb ... je normale andere vraag ... daarin geplaatst, omdat je dat beetje de index kunt gebruiken. Dus als u dit alleen wilt doen voor documenten waar de name veld is charles je kunt doen:

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 } }
] );

Met de invoer:

{ "_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" }

Dit geeft als resultaat:

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

Als u meer velden wilt, moet u deze toevoegen in het $project .



  1. Redis slaat strings op als buffers op sommige besturingssystemen, niet op andere?

  2. Update entiteit in redis met spring-data-redis

  3. Waarom is SQLite sneller dan Redis in deze eenvoudige benchmark?

  4. MongoDB $dayOfYear