簡體   English   中英

如何在 MongoDB 和 NodeJS 中正確使用 $lookup

[英]How to use $lookup correctly in MongoDB and NodeJS

我想使用 MongoDB 中的 $lookup 運算符從兩個集合中提取數據,在本例中,名稱字段匹配。 我已經使用 MongoDB Compass 來驗證查找代碼並且它可以工作,然后使用“導出到節點”功能來獲取查詢,但是我收到了一個錯誤(如下)。

這是我的查詢(API 端點)

import { connectToDatabase } from "util/mongodb"
export default async (req, res) => {

const pipeline = [
    {
        '$lookup' : {
            'from' : "addresses",
            'localField' : "name",
            'foreignField' : "name",
            'as' : "addresses"
        }
    }
]

const { db } = await connectToDatabase()
const posts = await db.collection('users').aggregate(pipeline);
res.json(posts)
console.log(res)

編輯:我不確定我是否應該使用 db.collection 或 db.getCollection。 如果我在 Robo3T(Mongo GUI)中使用 db.collection,它會響應“db.collection 不是函數”,但可以與“db.getCollection”一起使用。 如果我在 Node 中使用“db.getCollection”,那么它會說“db.getCollection 不是函數”。

上面的查詢是這樣調用的:

const fetcher = url => axios.get(url).then(res => res.data)

export default function Read() {

    const { data, error } = useSWR('/api/getData', fetcher)
    if (error) return `An error has occurred: ${error}`;
    if (!data) return "Loading...";

    return (
        <>
            ...
            {data.map((post) => (
                ...
            ))}
            ...
        </>
    )
}

當我打開上述頁面時,出現以下錯誤:

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of Object
at Function.from (buffer.js:333:9)
at toBuffer (/Users/Matt/Documents/WebApps/project/next-mongo-crud/node_modules/next/dist/compiled/compression/index.js:1:143155)
at ServerResponse.write (/Users/Matt/Documents/WebApps/project/next-mongo-crud/node_modules/next/dist/compiled/compression/index.js:1:141329)
at AggregationCursor.ondata (_stream_readable.js:719:22)
at AggregationCursor.emit (events.js:315:20)
at addChunk (_stream_readable.js:309:12)
at readableAddChunk (_stream_readable.js:284:9)
at AggregationCursor.Readable.push (_stream_readable.js:223:10)
at /Users/Matt/Documents/WebApps/project/next-mongo-crud/node_modules/mongodb/lib/core/cursor.js:372:12
at handleCallback (/Users/Matt/Documents/WebApps/project/next-mongo-crud/node_modules/mongodb/lib/core/cursor.js:32:5) {
code: 'ERR_INVALID_ARG_TYPE'

編輯 2:我有一個工作查詢,其中僅從一個集合中獲取數據,我只需要讓 $lookup 查詢工作即可。 這是單個集合查詢:

import { connectToDatabase } from "util/mongodb"
export default async (req, res) => {
const { db } = await connectToDatabase()
const posts = await db
    .collection("users")
    .find({})
    .toArray();
res.json(posts);
}

任何人都可以看到導致錯誤的原因嗎? 我已經查看了 SO 中的相應答案,但找不到解決方案。

干杯,馬特

當我查看您的前端時,它會收到帖子和錯誤信息。

但是后端它返回帖子,它需要將兩個值作為 json 返回

import { connectToDatabase } from "util/mongodb"

export default async (req, res) => {
  try {
    const pipeline = [
      {
        '$lookup' : {
            'from' : 'addresses',
            'localField' : 'name',
            'foreignField' : 'name',
            'as' : 'addresses'
        }
      }
    ]

    const { db } = await connectToDatabase()
    const posts = await db.collection('users').aggregate(pipeline).toArray();
    return res.json({ ...posts })
  } catch (error) {
    return res.json({ error })
  }
} // -> in your example, the closing of the function was missing.

我依賴你的例子,因為我無法在本地重現你的代碼,我真的不能。 但我認為這已經可以幫到你了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM