Monogdb находит записи, сравнивая два поля типа ObjectId - PullRequest
0 голосов
/ 28 июня 2019

У меня есть запрос, который работает нормально, когда я запускаю его в утилите MongoDB Compass:

{ $where: "if (this.media && this.media.length > 1 && this.status=='Published') {return this; } "}

В той же коллекции или таблице у меня есть еще два поля createBy и userId

enter image description here

Теперь я хочу отфильтровать записи, созданные по-другому, чем userId. Я пытаюсь это:

{ $where: "if (this.media && this.media.length > 1 && this.status=='Published' && this.userId != this.createdBy) {return this; } "}

И это также:

{ $where: "if (this.media && this.media.length > 1 && this.status=='Published' && ObjectId(this.userId) != ObjectId(this.createdBy)) {return this; } "}

Но ни одна из двух вышеперечисленных работ не работает. Я понимаю, что ObjectId имеет тип Object и сравнение объектов с точно такими же значениями не будет работать. Просто не понимаю, как это сравнить в консоли запросов mongodb.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Я думаю, вам нужен .toString() метод для сравнения двух ObjectIds

попробуй:

this.userId.toString()!= this.createdBy.toString()

Еще одна альтернатива будет использовать .equals()

this.userId.equals(this.createdBy)

Подробнее о .equals () и .toString () здесь.

1 голос
/ 28 июня 2019

Если вы используете версию Mongodb> = 3.6, вы можете попробовать операцию $expr, так как она быстрее, чем $where.

Для сравнения ObjectId с, вы можете использовать метод .equals() или вызвать .toString() для обоих ObjectId для сравнения

{ $where: "if (this.media && this.media.length > 1 && this.status=='Published' && !this.userId.equals(this.createdBy)) {return this; } "}
...