поскольку ваша ошибка кажется вполне понятной.

тим, у меня есть коллекция документов, которые выглядят так:

{
    "_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);
  }
)

Ответы на вопрос(1)

Ваш ответ на вопрос