Монгоское поле A больше поля B
Я пытаюсь выполнить простой запрос в Mongo, который в MySQL будет выглядеть следующим образом.
select * from emails where bounceCount > sentCount;
Пока у меня есть.
db.email.find({ bounceCount : { $gt : sentCount } } );
Но я получаю эту ошибку
JS Error: ReferenceError: sentCount is not defined (shell):0
Как ссылаться на sendCount в этой оболочке?
Ответы
Ответ 1
Каждый, кажется, упоминает $where
, не зная, что это:
- медленный
- небезопасный (с оценкой)
- JavaScript, а не внутренние объекты MongoDB
- И, в версиях до 2.4, однопоточных и глобально заблокированных
Другим методом, который будет намного лучше для примерно 99% случаев, является использование структуры агрегации:
db.col.aggregate([
{$project: {ab: {$cmp: ['$bounceCount','$sentCount']}}},
{$match: {ab:{$gt:0}}}
])
Ответ 2
db.so.find("this.bounceCount > this.sentCount")
- это то, что вы ищете.
Эквивалент: db.so.find({"$where":"this.bounceCount > this.sentCount"})
Документация: http://docs.mongodb.org/manual/reference/operator/where/
Выход оболочки:
> db.so.insert({bounceCount:1, sentCount:2})
> db.so.insert({bounceCount:5, sentCount:3})
> db.so.insert({bounceCount:5, sentCount:4})
> db.so.insert({bounceCount:5, sentCount:7})
> db.so.insert({bounceCount:9, sentCount:7})
> db.so.find()
{ "_id" : ObjectId("516d7f30675a2a8d659d7594"), "bounceCount" : 1, "sentCount" : 2 }
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 }
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 }
{ "_id" : ObjectId("516d7f3d675a2a8d659d7597"), "bounceCount" : 5, "sentCount" : 7 }
{ "_id" : ObjectId("516d7f40675a2a8d659d7598"), "bounceCount" : 9, "sentCount" : 7 }
> db.so.find({"bounceCount":5})
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 }
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 }
{ "_id" : ObjectId("516d7f3d675a2a8d659d7597"), "bounceCount" : 5, "sentCount" : 7 }
> db.so.find("this.bounceCount > this.sentCount")
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 }
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 }
{ "_id" : ObjectId("516d7f40675a2a8d659d7598"), "bounceCount" : 9, "sentCount" : 7 }
Ответ 3
Для этого вы можете использовать оператор $where, который позволяет использовать код Javascript в запросе.
В вашем примере вы бы сделали:
db.email.find({ $where: "this.bounceCount > this.sentCount" });
Дополнительную информацию о операторе $where см. на странице документации MongoDB:
http://docs.mongodb.org/manual/reference/operator/where/#op._S_where