Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从另一个集合MongoDB aggregate$lookup获取数据_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 从另一个集合MongoDB aggregate$lookup获取数据

Javascript 从另一个集合MongoDB aggregate$lookup获取数据,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有以下两个系列:仓库和产品 仓库文档结构如下所示: { _id: ObjectId("5f17dc2309ce612aa858b625") products:[ // product is string {product: "5f17dc3a09ce612aa858b627", count: 20}, {product: "5f17dc3a09ce612aa858b628", count: 10} ]

我有以下两个系列:
仓库
产品

仓库文档结构如下所示:

{
  _id: ObjectId("5f17dc2309ce612aa858b625")
  products:[ // product is string
    {product: "5f17dc3a09ce612aa858b627", count: 20}, 
    {product: "5f17dc3a09ce612aa858b628", count: 10}
  ] 
}
{
  _id: ObjectId("5f17dc3a09ce612aa858b627")
  name: "Tomatos",
  price: 5
}
产品文档结构如下所示:

{
  _id: ObjectId("5f17dc2309ce612aa858b625")
  products:[ // product is string
    {product: "5f17dc3a09ce612aa858b627", count: 20}, 
    {product: "5f17dc3a09ce612aa858b628", count: 10}
  ] 
}
{
  _id: ObjectId("5f17dc3a09ce612aa858b627")
  name: "Tomatos",
  price: 5
}
我需要使用
聚合
warehouse.products.product
值替换为
products
集合中id相同的产品

我认为
.populate('products.product')
在使用find时运行良好//不确定//但现在需要使用聚合

我希望这是仓库收集的最终结果:

{
_id: ObjectId("5f17dc2309ce612aa858b625")
    products:[
        {
           
           count:20,
              product: {
                  name: "Tomatos",
                  price: 5
    }
        },
        {
           count:10,
           product: {
                name: "Oranges",
                price: 8
    }
        }
    ] 
}
我试过这个,但不起作用:

{
   $lookup:
     {
       from: "products",
       let: { "pr": "products.product"},
        pipeline: [
      { $addFields: { "id": { "$toString": "$_id" }}},
                  { $match: { $expr: { $eq: [ "$id", "$$pr" ] } } }

    ],
       as: "products.product"
     }
}
工作

lookup
提供了一个数组。在您的情况下,您需要产品对象。所以我希望产品总是有一个目标。这就是为什么我使用
arrayElemAt
从数组中获取第一个对象,并用
ifNull
包装,因为有时候产品数组可能没有元素

工作


lookup
提供了一个数组。在您的情况下,您需要产品对象。所以我希望产品总是有一个目标。这就是为什么我使用
arrayElemAt
从数组中获取第一个对象,并用
ifNull
包装,因为有时候产品数组可能没有元素。

正常工作,但这样我会丢失仓库中的所有其他数据,我的意思是,如果它不仅仅是“\u id”和“products”的话。”。。在“产品”字段中也是如此。。如果没有id和count,则用
{$unwind:{path:'$products',preserveNullAndEmptyArrays:true}}替换
展开
没有帮助:(你可以在这里检查我添加到仓库的“name”和“opened”未出现在结果中的道具也在编辑的产品集合中数量:另外,我不想在aggreagate EDIT2中写入我希望看到的所有文件:如果可能的话,只需复制所有链接并替换warehouse.products.*每个procuts.*产品与产品集合中的相应产品这就是您想要的例如..您需要查看,当您在stackoverflow中询问任何问题时,请检查您包含的所有内容。您在主要问题中得到了回答,这是有效的,但这样我就丢失了仓库中的所有其他数据,我的意思是,如果不仅仅是“_id”和“products”。“products”中也是一样的字段..如果没有id和count,则用
{$unwind:{path:'$products',preserveNullandmptyarray:true}}替换
展开
没有帮助:(你可以在这里检查我添加到仓库的“name”和“opened”未出现在结果中的道具也在编辑的产品集合中数量:另外,我不想在aggreagate EDIT2中写入我希望看到的所有文件:如果可能的话,只需复制所有链接并替换warehouse.products.*每个procuts.*产品与产品集合中的相应产品这就是您想要的对于..您需要查看,当您在stackoverflow中询问任何问题时,请检查您包含的所有内容。您在主要问题中所问的问题都得到了回答,