поскольку ваша ошибка кажется вполне понятной.
тим, у меня есть коллекция документов, которые выглядят так:
{
"_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}
Как мне выполнить этот запрос / что здесь происходит? Я ожидал, что мой запрос сработает, основываясь надокументы Я прочел. Выше,e
должен быть элементомacl
массив, поэтому я ожидаю, что у него есть полеprofile
, но, похоже, это не так.
Обратите внимание, я использую Mongo 3.2, поэтому я не могу использовать$ выраж, что я видел некоторые ресурсы предполагают, что это возможно.
разрешение
Оказывается, я сделал неверное предположение о схеме этой коллекции. Причина, по которой я столкнулся с вышеуказанной ошибкой, заключается в том, что некоторые документы имеют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);
}
)