MongoDB Агрегировать и сохранять все значения при установке активного ключа - PullRequest
0 голосов
/ 13 октября 2018

Я хочу, чтобы все значения возвращались из "Items", и когда есть совпадение, я хочу, чтобы "isActive" было истинным.

exports.listUserItems = function (req, res) {

  // Aggregate results
  User.aggregate([{
      "$match": {
          "username": req.params.username
      }
  }, {
      "$lookup": {
          "from": "Items",
          "localField": "itemIds",
          "foreignField": "_id",
          "as": "items"
      }
  }, {
      "$unwind": {
          "path": "$items"
      }
  }, {
      "$project": {
          "item": "$items.item_name",
          "isActive": '1',
          "_id": 0
      }
  }], (err, result) => res.json(result));
};

Каков наилучший способ добиться этого?

Я собирался вернуть все элементы и пользовательские элементы по отдельности, затем сравнить их и объект.значить их и т. Д. И т. Д., Что кажется излишним.Можно ли это сделать на стороне модели?

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

Редактировать:

Пользовательский документ

{
    "username" : "anonuser",
    "items" : [ 
        ObjectId("5ba8345f1e56fe8e6caaaa07"), 
        ObjectId("5ba706d64e82292e72e9ae71")
    ]
}

Затем у меня есть коллекция "Items", в которой есть 3 таких документа:

{
    "_id" : ObjectId("5ba706d64e82292e72e9ae71"),
    "item_name" : "Salary"
}

Мой ожидаемый вывод json api должен быть.

[{"_id":"5ba706d64e82292e72e9ae71","item_name":"Salary","isActive":true},{"_id":"5ba8345f1e56fe8e6caaaa07","item_name":"Fulltime","isActive":true},{"_id":"5ba9af6c1e56fe8e6cab521e","item_name":"Advisor","isActive":false}]

1 Ответ

0 голосов
/ 13 октября 2018

Вы можете попробовать ниже агрегации

Items.aggregate([
  { "$lookup": {
    "from": "users",
    "let": { "itemsId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$$itemsId", "$items"] }}},
      { "$project": { "isActive": { "$literal": true }}}
    ],
    "as": "items"
  }},
  { "$addFields": {
    "isActive": {
      "$ifNull": [{ "$arrayElemAt": ["$items.isActive", 0] }, { "$literal": false }]
    }
  }},
  { "$project": { "items": 0 }}
])
...