Цикл по массиву и выполнение запросов Mongo для изменения того же массива - PullRequest
3 голосов
/ 15 мая 2019

У меня есть коллекция "user" с такими документами, как

{
    _id:ObjectId("xx"),
    searches:[
        {someId:"yyy","fav_food":"pasta"},
        {someId: "zzz","fav_food":"macncheese"}
    ]
}

SomeId сопоставляется с другой "работой" коллекции

{
_id:yyy,
job_name:"clerk",
"name": "kent"
},
{
_id:zzz,
job_name:"racer",
"name":"michael"
}

Мне нужно улучшить данные в пользовательской коллекции изколлекция заданий

Таким образом, пользовательский документ должен быть:

{
    _id:ObjectId("xx"),
    searches:[
        {someId:"clerk::kent",fav_food:"pasta"},
        {someId: "michael::racer","fav_food":"macncheese"}
    ]
}

У меня есть

    mongo_db.collection('job', function(err,coll){
        for(var i = 0; i <= data.searches.length-1; i++) {
            var pid = data.searches[i].someId;
            console.log("RELEASE ID " + someId);

            if(pid !== null || pid !== undefined){
                result =  coll.findOne({"_id":ObjectId(pid)});
                if(result){
                    console.log("this is data searches for index " + i+ " " + JSON.stringify(data.searches[i]) 
                            + " and data.searches " + JSON.stringify(data.searches) + " and this is result " + JSON.stringify(result));
                    data.searches[i].someId =  result.name + "::" + result.job_name;


                }
            }
        }
        return data;
    })

Это не похоже на работу ... Любая идея, как я могу сделатьэтот?Я знаю, что должен использовать функции Promises / Async, но не могу найти правильную комбинацию.

Ответы [ 3 ]

0 голосов
/ 15 мая 2019

Нет необходимости делать это в javascript, если вы можете сделать это в агрегированных запросах mongodb. Как это показано ниже:

db.user.aggregate([{
    $unwind: "$searches"
  },
  {
    $lookup: {
      from: "job",
      localField: "searches.someId",
      foreignField: "_id",
      as: "search"
    }
  },
  {
    $unwind: "$search"
  },
  {
    $group: {
      _id: "$_id",
      searches: {
        $addToSet: {
          "fav_food": "$searches.fav_food",
          "someId": {
            $concat: ["$search.name", '::', "$search.job_name"]
          }
        }
      }
    }
  }
])
0 голосов
/ 15 мая 2019

Проверьте комментарии:

//1. Below code snippet can optimize your task
//2. You will be able to return desire result

mongo_db.collection('job', function(err, coll) {
    var pid = [];
    for (var i = 0; i <= data.searches.length - 1; i++) {
        pid.push(data.searches[i].someId); //!! gather all the pids in array
        // console.log("RELEASE ID " + someId);
    }
    if (pid !== null || pid !== undefined) {
        // result = coll.findOne({ "_id": ObjectId(pid) });

        //!! Search all the data with $in agg. in one step
        //!! In this find all data's callback do your further task

        if (result) {
            //!! loop thru the result and make your desire array
            console.log("this is data searches for index " + i + " " + JSON.stringify(data.searches[i]) +
                " and data.searches " + JSON.stringify(data.searches) + " and this is result " + JSON.stringify(result));
            data.searches[i].someId = result.name + "::" + result.job_name;
            // !! retrun the data after loop
            return data;
        }
    }
})
0 голосов
/ 15 мая 2019

Просто сделай это с монго aggregate. Это дает ожидаемый результат. Просто попробуйте

db.getCollection('user').aggregate([
{
$unwind:{
    path:"$searches",
    preserveNullAndEmptyArrays:true
    }
},
{
$lookup:{
    from:"job",
    localField:"searches.someId",
    foreignField:"_id",
    as:"details"
    }
},
{
$unwind:{
    path:"$details",
    preserveNullAndEmptyArrays:true
    }
},
{
$group:{
    _id:"$_id",
    searches:{
        $push:{
            someId:{ $concat: [ "$details.job_name", "::", "$details.name" ] },
            fav_food:"$searches.fav_food"
            }
        }
    }
}
])

Результат

{
"_id" : ObjectId("5cdb9dce6b57e490aaee734a"),
"searches" : [ 
    {
        "someId" : "clerk::kent",
        "fav_food" : "pasta"
    }, 
    {
        "someId" : "racer::michael",
        "fav_food" : "macncheese"
    }
]
}
...