То, что я пытаюсь решить, заключается в следующем: сохранение порядка моего массива идентификаторов с помощью $с использованием этого предложенного метода (mapReduce): Предоставляет заказ гарантии MonoDB в $
Я сделал домашнее задание и увидел, что он идеален для преобразования их в строки: Сравнение mongoose _id и строк.
Код:
var dataIds = [ '57a1152a4d124a4d1ad12d80',
     '57a115304d124a4d1ad12d81',
     '5795316dabfaa62383341a79',
     '5795315aabfaa62383341a76',
     '57a114d64d124a4d1ad12d7f',
     '57953165abfaa62383341a78' ];
CollectionSchema.statics.all = function() {
      var obj = {};
      //adds dataIds to obj.scope as inputs , to be accessed in obj.map
      obj.scope = {'inputs': dataIds};
      obj.map = function() {
        //used toString method as suggested in other SO answer, but still get -1 for Id.
        var order = inputs.indexOf(this._id.toString());
        emit(order, {
          doc : this
        });
      };
      obj.reduce = function() {};
      obj.out = {inline: 1};
      obj.query = {"_id": {"$in": dataIds } };
      obj.finalize = function(key, value) {
        return value;
      };
      return Product
        .mapReduce(obj)
        .then(function(products){
          console.log('map products : ', products)
        })
     };
Это то, что я все время возвращаю для своей консоли .log в обещаниях продуктов:
[{ _id: -1, value: null } ]
Что, заставляет меня поверить, что он не может сопоставить ObjectId с этим индексом dataIds. Однако, если я просто использую предложение $in внутри .find(), возвращаются правильные продукты, но в неправильном порядке.
Update:
возникает неожиданное поведение.
  obj.map = function() {
    for(var i = 0; i < inputs.length; i++){
      if(inputs[i] == this._id.toString()){
      }
      emit(inputs[i], this);
    }
  };
испускает:
 [ { _id: '5795315aabfaa62383341a76', value: null },
  { _id: '57953165abfaa62383341a78', value: null },
  { _id: '5795316dabfaa62383341a79', value: null },
  { _id: '57a114d64d124a4d1ad12d7f', value: null },
  { _id: '57a1152a4d124a4d1ad12d80', value: null },
  { _id: '57a115304d124a4d1ad12d81', value: null } ]
  obj.map = function() {
    for(var i = 0; i < inputs.length; i++){
      if(inputs[i] == this._id.toString()){
        var order = i;
      }
      emit(this._id.toString(), this);
    }
  };
испускает:
[ { _id: 'ObjectId("5795315aabfaa62383341a76")', value: null },
  { _id: 'ObjectId("57953165abfaa62383341a78")', value: null },
  { _id: 'ObjectId("5795316dabfaa62383341a79")', value: null },
  { _id: 'ObjectId("57a114d64d124a4d1ad12d7f")', value: null },
  { _id: 'ObjectId("57a1152a4d124a4d1ad12d80")', value: null },
  { _id: 'ObjectId("57a115304d124a4d1ad12d81")', value: null } ]
Теперь, как мне избавиться от обертки ObjectId()? Предпочтительно, что-то более чистое, чем str.slice(), которое будет работать. Однако я чувствую, что должно быть более "монго" /более безопасный способ преобразования Id.
Я проверил документы, но только упоминает метод toString(), который, похоже, не работает корректно в пределах карты: https://docs.mongodb.com/manual/reference/method/ObjectId.toString/
