Допустим, у меня есть коллекция документов, которая выглядит следующим образом:
{
"_id" : ObjectId("5afa6df3a24cdb1652632ef5"),
"createdBy" : {
"_id" : "59232a1a41aa651ddff0939f"
},
"owner" : {
"_id" : "5abc4dc0f47f732c96d84aac"
},
"acl" : [
{
"profile" : {
"_id" : "59232a1a41aa651ddff0939f"
}
},
{
"profile" : {
"_id" : "5abc4dc0f47f732c96d84aac"
}
}
]
}
Я хочу найти все документы, где createdBy._id != owner._id
И где createdBy._id
появляется в одной из записей вacl
массив.Со временем я захочу обновить все такие документы, чтобы установить поле owner._id
равным полю createdBy._id
.Сейчас я просто пытаюсь выяснить, как запросить подмножество документов, которые я хочу обновить.
До сих пор я придумал следующее:
db.boards.find({
$where: "this.createdBy._id != this.owner._id",
$where: function() {
return this.acl.some(
function(e) => {
e.profile._id === this.createdBy._id
}, this);
}
)
(я использовал синтаксис ES5 на случай, если ES6 не в порядке)
Но когда я запускаюВ этом запросе я получаю следующую ошибку:
Ошибка: ошибка: {"ok": 0, "errmsg": "Ошибка типа: e.profile не определен: \ n_funcs2 / <@: 2:36 \ n_funcs2 @: 2: 12 \ n "," code ": 139} </p>
Как мне выполнить этот запрос / что здесь происходит?Я ожидал, что мой запрос сработает, основываясь на прочитанных мною документах .Выше e
должен быть элементом массива acl
, поэтому я ожидаю, что у него будет поле profile
, но это не так.
Обратите внимание, я использую Mongo 3.2, поэтому я не могу использовать $ expr , что, как я видел, некоторые ресурсы указывают на возможность.
Разрешение
Оказывается, я сделал неверное предположение о схеме этой коллекции.Причина, по которой я столкнулся с вышеуказанной ошибкой, состоит в том, что некоторые документы имеют массив acl
с элементом, который не имеет поля profile
.Приведенный ниже запрос проверяет этот случай.У него также есть один $where
, потому что способ, которым я написал его изначально (с двумя), в конечном итоге дал мне ИЛИ условий вместо И.
db.boards.find({
$where: function() {
return this.acl.some(
function(e) => {
e.profile !== undefined && e.profile._id === this.createdBy._id && this.createdBy._id != this.owner._id
}, this);
}
)