Sie können ein Feld nicht mit dem Wert eines anderen Felds mit dem normalen Abfrageabgleich vergleichen. Allerdings können Sie dies mit dem Aggregations Rahmen tun:
db.so.aggregate([
{ $match: …your normal other query… },
{ $match: { $eq: [ '$modified', '$sync' ] } }
]);
Ich habe ... Ihre normale andere Abfrage ... da drin, wie Sie das Bit den Index verwenden, machen kann. Also, wenn Sie dies nur für Dokumente tun wollen, wo das name
Feld ist charles
können Sie 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" }
Das gibt:
{
"result" : [
{
"_id" : ObjectId("520276949bf0f0f3a6e458a1"),
"modified" : 46,
"sync" : 45,
"name" : "charles",
"eq" : 1
}
],
"ok" : 1
}
Wenn Sie Möchten Sie weitere Felder, müssen Sie sie in der $project
hinzufügen.
Danke Jungs, sowohl Aggr und Abfrage sollte funktionieren. –
Sie sollten die '' $ where'' Variante jedoch wirklich meiden, da sie Javascript durchläuft. Bitte akzeptieren Sie die Antwort. – Derick