предельные поля в агрегации $ lookup - PullRequest
0 голосов
/ 15 ноября 2018

MongoDB DB версия 3.4.18.

Я хочу объединить данные из чужой коллекции, но я не хочу, чтобы это были все ключи, я хочу установить ограничение, вот так:

db.users.find({}, {password:0}, (err, docs) => {});

И это мой запрос агрегации:

let query = [
  {
    // match from first collection (activities)
    $match: {
      "_id": ObjectId("5be46f266e4a182384b3ae6a")
    }
  },
  {
    // limit fields from first collection (activities)
    $project: {
      "_user": 1,
      date: 1
    }
  },
  {
    // join a foreign collection - but how to avoice the password key? for example.
    $lookup: {
      from: "users",
      localField: "_user",
      foreignField: "_id",
      as: "user"
    }
  }
];
db.activities.aggregate(query, (err, docs) => {
  console.log(docs[0].user);
  return cast.ok();
});

И у меня есть подвопрос.

Зачем использовать find, если я могуиспользуйте aggregate с $match вместо запроса

1 Ответ

0 голосов
/ 15 ноября 2018

MongoDB 3.6, "вложенный" $ lookup

db.activities.aggregate([
  { "$match": { "_id": ObjectId("5be46f266e4a182384b3ae6a") }},
  { "$lookup": {
    "from": "users",
    "let": { "user": "$_user" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_id", "$$user"] }}},
      { "$project": { "password": 0 }}
    ],
    "as": "user"
  }},
  { "$project": { "user": 1, "date": 1 }},
])

Стандартный MongoDB $ lookup

db.activities.aggregate([
  { "$match": { "_id": ObjectId("5be46f266e4a182384b3ae6a") }},
  { "$lookup": {
    "from": "users",
    "localField": "_user",
    "foreignField": "_id",
    "as": "user"
  }},
  { "$project": { "user.password": 0 }},
])
...