добавить ключ во вложенный массив с условием - PullRequest
0 голосов
/ 11 июня 2018

У меня есть простая структура данных в mongodb:

{
  _id: ObjectID,
 name: 'Name',
 birthday: '25.05.2001'
 items: [
          {
             _id: ObjectID,
             name: 'ItemName',
             info: 'ItemInfo',
           },
           {
             _id: ObjectID,
             name: 'ItemName',
             info: 'ItemInfo',
           }
        ]
}

Теперь я хочу запрос, который принимает ObjectID (_id) элемента в качестве критерия и возвращает мне объект со всеми элементами в массивеИ проецирует новое поле «selected» со значением true или false в поле в результате каждого элемента массива:

Я пробовал это с этим запросом:

 { $unwind: '$items' },
 {
    $project: {
       selected: {
          $cond: { if: { 'items._id': itemObjectID }, then: true, else: false },
      },
    },
  },    

, но MongoDB дает мненазад ошибка:

MongoError: FieldPath field names may not contain '.'.

Понятия не имею, почему это не работает, любая помощь или идеи?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

@ Ашиш: Большое спасибо за вашу помощь!Ваш ответ помог мне построить правильный запрос для меня:

  db.collection.aggregate([
  {
    $unwind: "$items"
  },
  {
    $project: {
      "items.name": 0,
      "birthday": 0
    }
  },
  {
    "$addFields": {
      "items.selected": {
        "$eq": [
          1111,
          "$items._id"
        ]
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      "name": {
        "$first": "$name"
      },
      items: {
        $push: "$items"
      }
    }
  },
  {
    $match: {
      "items._id": {
        $eq: 1111
      }
    }
  },
])

и привел к результату, который выглядит следующим образом:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "items": [
      {
        "_id": 1111,
        "selected": true
      },
      {
        "_id": 2222,
        "selected": false
      }
    ],
    "name": "Name"
  }
]
0 голосов
/ 11 июня 2018

Здесь вам не хватает $ eq оператора агрегирования, который проверяет условие равенства.

Здесь вы можете попробовать агрегацию ниже, если вы хотите проверить ObjectId, тогда вынужно поставить mongoose.Types.ObjectId(_id)

db.collection.aggregate([
  { "$unwind": "$items" },
  { "$addFields": {
    "items.selected": {
      "$eq": [
        1111,
        "$items._id"
      ]
    }
  }},
  { "$group": {
    "_id": "$_id",
    "name": { "$first": "$name" },
    "items": {
      "$push": {
        "_id": "$items._id",
        "selected": "$items.selected"
      }
    }
  }}
])

даст следующий вывод

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "items": [
      {
        "_id": 1111,
        "selected": true
      },
      {
        "_id": 2222,
        "selected": false
      }
    ],
    "name": "Name"
  }
]

Вы можете проверить это здесь

...