Mongodb агрегат с совпадением, поиском и проектом - PullRequest
0 голосов
/ 09 мая 2018

Я новичок в узле js с программированием mongodb. Я использую модуль mongodb и хочу выполнить публикацию сообщения с публичной информацией пользователя. Код, который я сейчас использую, выглядит следующим образом:

db.collection('post').aggregate({ 
  '$match': { category: 'video', status: 'online' },
  '$lookup': 
   { 
     from: 'user',
     localField: 'user',
     foreignField: '_id',
     as:'user'
  },
  '$project': 
     { text: 1,
       imgs: 1,
       video: 1,
       datetime: 1,
       user: 1,
       category: 1,
       marketplace: 1,
       tags: 1 } }
})
.toArray(function(err,posts){console.log(posts)})

но ничего не работает. Я получаю сообщения, даже если категория не music и поиск не привязывает объект к массиву результатов.

UPDATE агрегат не работает, даже если параметр $ match используется только как агрегатный запрос

возвращенные коллекции

[
  {
    "_id":"5aed6cbbd8362bcc0f2d95ab",
    "category":"music",
    "video":"",
    "imgs":[],
    "videoImage":false,
    "text":"post text",
    "tags":{["first","try"]}, 
    "datetime":1525509307968,
    "user":"FuRRTBEYBmCSDPJkN",
    "status":"online","marketplace":null}, 
  { 
    "_id":"5aedc26c6defa3d3a6de7126", "category":"music",
    "video":"https://www.youtube.com/embed/1yvLYJ2Fe_c", 
    "imgs" [],
    "videoImage":"https://i.ytimg.com/vi/1yvLYJ2Fe_c/hqdefault.jpg",
    "text":"second post text second post text second post text ",
    "tags":{["second","post"]},
    "datetime":1525531244425,
    "user":"FuRRTBEYBmCSDPJkN",
    "status":"online",
    "marketplace":null
   }
]

ожидаемые результаты будут

[
  {
    "_id":"3aed6cbbd8362bcc0f2d95ab",
    "category":"video",
    "video":"",
    "imgs":[],
    "videoImage":false,
    "text":"post text",
    "tags":{["first","video"]}, 
    "datetime":1525509307968,
    "user": {_id: 'FuRRTBEYBmCSDPJkN', username: 'user1',img: '/path/to/the/image.png'},
    "status":"online","marketplace":null}, 
  { 
    "_id":"4aedc26c6defa3d3a6de7126", "category":"video",
    "video":"https://www.youtube.com/embed/1yvLYJ2Fe_c", 
    "imgs" [],
    "videoImage":"https://i.ytimg.com/vi/1yvLYJ2Fe_c/hqdefault.jpg",
    "text":"second video ",
    "tags":{["second","video"]},
    "datetime":1525531244425,
    "user":{_id: 'FuRRTBEYBmCSDPJkN', username: 'user1',img: '/path/to/the/image.png'},
    "status":"online",
    "marketplace":null
   }
]

1 Ответ

0 голосов
/ 11 мая 2018

Как сказал Алекс в комментарии, решение моей проблемы - передать конвейер array в агрегатную функцию, как показано ниже.

db.collection('post').aggregate([
  '$match': { category: 'video', status: 'online' },
  '$lookup': 
   { 
     from: 'user',
     localField: 'user',
     foreignField: '_id',
     as:'user'
  },
  '$project': 
     { text: 1,
       imgs: 1,
       video: 1,
       datetime: 1,
       user: 1,
       category: 1,
       marketplace: 1,
       tags: 1 } }
])
.toArray(function(err,posts){console.log(posts)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...