MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Vergleichen Sie zwei Datumsfelder in MongoDB

Sie können ein Feld nicht mit dem Wert eines anderen Felds mit dem normalen Abfrageabgleich vergleichen. Sie können dies jedoch mit dem Aggregationsframework tun:

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

Ich habe … Ihre normale andere Abfrage … dort eingefügt, da Sie dieses Bit dazu bringen können, den Index zu verwenden. Wenn Sie dies also nur für Dokumente tun möchten, bei denen der name Feld ist charles Sie können Folgendes tun:

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

Mit der Eingabe:

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

Dies gibt zurück:

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

Wenn Sie weitere Felder wünschen, müssen Sie diese im $project hinzufügen .