猫鼬,带有$ lookup的汇总查询返回null吗?

时间:2020-02-03 10:44:05

标签: mongodb mongoose

无变矿物质模型:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const varyantaltSchema = new Schema({
  _id: {
    type: Schema.ObjectId
  },
  varyantid: {
    type: String
  },
  altvaryantname: {
    type: String
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
});

module.exports = mongoose.model("varyantalt", varyantaltSchema, "varyantalt");

变体模型:

const varyantSchema = new Schema({
  _id: {
    type: Schema.ObjectId
  },
  stokid: {
    type: Schema.ObjectId
  },
  varyantname: {
    type: String
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
});

module.exports = mongoose.model("varyant", varyantSchema, "varyant");

各种收藏集:

{
    "_id": ObjectId("5e32286c34fb7322bdd566ed"),
    "stokid": ObjectId("5e28b4a2a1d9692b29a65b24"),
    "varyantname": "RENK"
}

其他集合:

{
    "_id": ObjectId("5e3228df34fb7322bdd566f5"),
    "varyantid": "5e32286c34fb7322bdd566ed",
    "altvaryantname": "KIRMIZI",
    "vars": [
        {
            "_id": ObjectId("5e35b1e410fce83f3370cd0a"),
            "images": {
                "imageurl": "http://",
                "_id": ObjectId("5e35b1e410fce83f3370cd0b"),
                "filename": "5320_7d93",
                "path": "https://res",
                "publicid": "panel"
            }
        }
    ]
},
{
    "_id": ObjectId("5e3359e6fa4c5e4bd9112fb6"),
    "varyantid": "5e32286c34fb7322bdd566ed",
    "altvaryantname": "SARI",
    "vars": [
        {
            "_id": ObjectId("5e35b1f610fce83f3370cd0d"),
            "images": {
                "imageurl": "http://",
                "_id": ObjectId("5e35b1f610fce83f3370cd0e"),
                "filename": "veli-fidan-1LT-2-450x450",
                "path": "https://",
                "publicid": "panel"
            }
        }
    ]
},
{
    "_id": ObjectId("5e335b64fa4c5e4bd9112fc9"),
    "varyantid": "5e32286c34fb7322bdd566ed",
    "altvaryantname": "YEŞİL",
    "vars": [
        {
            "_id": ObjectId("5e35b20010fce83f3370cd10"),
            "images": {
                "imageurl": "http://",
                "_id": ObjectId("5e35b20010fce83f3370cd11"),
                "filename": "maxresdefault-29-450x450",
                "path": "https://",
                "publicid": ""
            }
        }
    ]
}

查询:

varyant
  .aggregate([
    {
      $match: {
        stokid: mongoose.Types.ObjectId("5e28b4a2a1d9692b29a65b24")
      }
    },
    {
      $lookup: {
        from: "varyantalt",
        localField: "_id",
        foreignField: "varyantid",
        as: "vars"
      }
    },
    { $unwind: "$vars" }
  ])
  .exec((err, locations) => {
    if (err) throw err;
    console.log("res::", locations);
  });

我正试图通过猫鼬的$aggregate$lookup查询来获得结果 为什么我的查询返回空?我找不到问题。

$lookup运算符from: 'varyantalt'下,我不确定它是否为空值。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在您的varyantaltSchema模式中,varyantid被定义为String,但必须为Schema.ObjectId

它们必须是相同的,因为$lookup从输入文档中对foreignField和localField执行相等的匹配

如果将您的variandid保存为“对象ID”,则聚合将起作用。