Вы не можете сравнить поле со значением другого поля с обычным соответствием запросам. Тем не менее, вы можете сделать это с рамками агрегации:
db.so.aggregate([
{ $match: …your normal other query… },
{ $match: { $eq: [ '$modified', '$sync' ] } }
]);
Я положил ... ваш нормальный другой запрос ... там, как вы можете сделать это немного использовать индекс. Так что если вы хотите сделать это только для документов, где name
поле charles
вы можете сделать:
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 } }
]);
с входом:
{ "_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" }
Это возвращает:
{
"result" : [
{
"_id" : ObjectId("520276949bf0f0f3a6e458a1"),
"modified" : 46,
"sync" : 45,
"name" : "charles",
"eq" : 1
}
],
"ok" : 1
}
Если вы хотите больше полей, вам нужно добавить их в $project
.
Спасибо, ребята, как aggr, так и запрос должны работать. –
Вы должны действительно избегать варианта '' $ where'', хотя, поскольку он проходит через Javascript. Также, пожалуйста, примите ответ. – Derick