sql >> Database teknologi >  >> NoSQL >> MongoDB

Sammenlign to datofelter i MongoDB

Du kan ikke sammenligne et felt med værdien af ​​et andet felt med den normale forespørgselsmatchning. Du kan dog gøre dette med aggregeringsrammen:

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

Jeg sætter ... din normale anden forespørgsel ... derind, da du kan få den bit til at bruge indekset. Så hvis du kun vil gøre dette for dokumenter, hvor name feltet er charles du kan gøre:

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

Med input:

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

Dette returnerer:

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

Hvis du vil have flere felter, skal du tilføje dem i $project .



  1. Brug LIKE/regex med variabel i mongoid

  2. Redis serviceStack pooled forbindelsesklient

  3. Forespørgsel efter datoer med Mongo Spring-data vs Mongos konsol (datoer)

  4. MongooseJS - Sådan gemmer du dokument og refererede dokument