2016-06-13 3 views
1

У меня есть схема, которая выглядит следующим образомMongoose Aggregation соответствует массив ObjectIds

var Post = new mongoose.Schema({ 
    author: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    created: { 
     type: Date, 
     Default: Date.now 
    }) 

У меня есть таблица пользователей, а также. У меня есть массив пользовательских идентификаторов и я пытаюсь найти пост таблицу на основе массива пользователя Идентификаторы

Для примера

var userIds = ["575e96652473d2ab0ac51c1e","575e96652473d2ab0ac51c1d"] .... and so on 

Я хочу, чтобы вернуть все сообщения, созданные этими пользователями. И сообщения должны быть отсортированы по дате создания. Есть ли способ сгруппировать этот пост на основе предоставленных идентификаторов пользователей, в основном соответствуют сообщениям для отдельного пользователя?

В результате я пытаюсь достичь что-то вроде этого:

[{ 
    userAId : "56656.....", 
    post : [postA, postB], 
    },{ 
    userBId :"12345...", 
    post : [postA, postB] 
}] 

Как написать этот запрос?

Это то, что я до сих пор

Post.aggregate([{ 
    // {"$unwind" : ""}, 
    // "$group": { 
    //  _id: "$author", 
    //  "created" : {"$sum" : 1 } 
    // } 
    "$match" : { author : id} 
}]).exec(function(error, data) { 
    if(error){ 
    return console.log(error); 
    }else{ 
    return console.log(data) 
    } 
}) 



{ 
    "_id" : ObjectId("575e95bc2473d2ab0ac51c1b"), 
    "lastMod" : ISODate("2016-06-13T11:15:08.950Z"), 
    "author" : ObjectId("575dac62ec13010678fe41cd"), 
    "created" : ISODate("2016-06-13T11:15:08.947Z"), 
    "type" : "photo", 
    "end" : null, 
    "commentCount" : 0, 
    "viewCount" : 0, 
    "likes" : 0, 
    "tags" : [], 
    "title" : "Today is a good day", 
    "__v" : 0 
} 
+0

вы могли бы разместить полный почтовый документ из Монго? – profesor79

+0

Вы имеете в виду опубликовать всю схему документа для публикации? – unwosu

+0

db.post.findOne() в порядке - пожалуйста, удалите конфиденциальную информацию – profesor79

ответ

2

Чтобы вернуть все сообщения, созданные пользователями, изображенных в списке идентификаторов, используйте оператор в $in в запросе, а затем цепь метод sort() к запрос для упорядочивания результатов, созданного поля даты:

Post.find({ "author": { "$in": userIds } }) 
    .sort("-created") // or .sort({ field: 'asc', created: -1 }); 
    .exec(function (err, data){ 
     if(error){ 
      return console.log(error); 
     } else { 
      return console.log(data); 
     } 
    }); 

Чтобы получить результат, где у вас есть почта идентификаторы сгруппированы для каждого пользователя, вам необходимо выполнить следующую операцию агрегации:

Post.aggregate([ 
    { "$match:" { "author": { "$in": userIds } } }, 
    { "$sort": { "created": -1 } }, 
    { 
     "$group": { 
      "_id": "$author", 
      "posts": { "$push": "$_id" } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "userId": "$_id", 
      "posts": 1 
     } 
    } 
]).exec(function (err, result){ 
    if(error){ 
     return console.log(error); 
    } else { 
     return console.log(result); 
    } 
}); 

Или с беглым API:

Post.aggregate() 
    .match({ "author": { "$in": userIds } }) 
    .sort("-created") 
    .group({ 
     "_id": "$author", 
     "posts": { "$push": "$_id" } 
    }) 
    .project({ 
     "_id": 0, 
     "userId": "$_id", 
     "posts": 1 
    }) 
    .exec(function (err, result){ 
     if(error){ 
      return console.log(error); 
     } else { 
      return console.log(result); 
     } 
    }); 
+0

есть ли способ сгруппировать это сообщение на основе предоставленных идентификаторов пользователя? В основном соответствуют сообщениям для отдельного пользователя например: [userAId: "56656", post: [{postA, postB}], userBId: "xys", post: [postA, postB]} – unwosu

+0

Было бы лучше получить сообщения из базы данных и сделать конкатенация в коде? – unwosu

+0

@ user34 12942 Не могли бы вы обновить свой вопрос с оригинальной проблемы. _I хочу вернуть все сообщения, созданные этими пользователями. И сообщения должны быть отсортированы по дате создания. Как я могу написать этот запрос? _ Решен, не так ли? Имейте в виду, что здесь считается неправильной практикой, чтобы изменить свой вопрос, когда уже есть ответы - [** chameleon questions **] (http://meta.stackexchange.com/questions/43478/exit-strategies-for- хамелеону вопросы /). – chridam

0

Это должно быть возможно без агрегации.

Post 
.find({ author: { $in: userIds } }) 
.sort({ created: -1 }) 

Если вы получаете CastError: Cast, чтобы ObjectId не удалось, убедитесь, что сопоставить UserIds массив из массива строк в массив мангуст идентификаторами.

UserIds = userIds.map (идентификатор пользователя => новый mongoose.Types.ObjectId (идентификатор пользователя))

+0

Есть ли способ сгруппировать это сообщение на основе идентификаторов пользователей? в основном соответствуют сообщениям для отдельного пользователя. {userAId: "56656", post: [{postA, postB}], userBId: "xys", post: [postA, postB]} – unwosu

Смежные вопросы