簡體   English   中英

使用對象和 id 數組查詢 MongoDB

[英]Query MongoDB using an object and array of ids

在搜索 MongoDB 數據時,我已經能夠通過向查詢對象添加任何非空字段來根據用戶提供的任何字段來查詢集合,到目前為止,這已經涵蓋了我的所有基礎。 但是我遇到了需要添加它的問題。 基本上對 10 多個字段執行此操作:

let query = {};

let weekNumber = null;
  if (req.params.weekNumber !== 'noDataSent'){
    weekNumber = req.params.weekNumber;
    query.weekNumber = weekNumber;
  }

...

Ticket.find(query)...

我有兩個集合,用戶和票。 Ticket 對象包含對 User 對象的 objectId 引用。 由於引用的原因,我無法通過用戶名查詢門票,因此我根據提供的名稱查找所有用戶,然后提取他們的 _id 以添加到查詢對象中。 在這種情況下,如果未指定任何其他內容,我希望結果僅返回與任何用戶 _id 匹配的票證,如果還有其他字段可以相同,則匹配其他所有內容並找到具有用戶 ID 的票證.

我嘗試過使用$or$in ,但除非我做錯了什么,否則我無法弄清楚如何使這項工作正常進行。

這樣做會返回一個錯誤,我什至不確定在這種情況下如何使用$or

let users = [];

    User.find( { $or: [ { firstname: requestor }, { lastname: requestor } ] } ).exec((err, user) => {

      if (err){ return res.status.json({err: "No user(s) found"}); }
      
      user.forEach((e) => {
        users.push(new ObjectId(e._id));
      });
    });


Ticket.find(query, { requestor: { $in: users } } )

如何匹配查詢對象中的所有字段並使用此設置找到所有帶有用戶 _id 的票證?

編輯:我已經嘗試這樣做以使其在兩者中都進行搜索,並且確實可以正確搜索用戶並帶回與他們相關的票證,它忽略了查詢對象中的所有內容。

        Ticket.find({
          $and: 
          [
            { query },
            {requestor: 
              { $in: users.map(doc => new ObjectId(doc._id)) 
              }
            }
          ]
        })

您在 User.find() 的回調之外運行Ticket.find() User.find() 雖然這是有效代碼,但這兩個查詢都有效地排隊等待並發執行,Ticket 查詢利用了用戶數組——用戶查詢尚未填充。

為了使用用戶查詢的結果,您必須將下一段代碼放入該回調中,該回調只能在查詢完成后調用:

User.find({
  $or: [
    { firstname: requestor },
    { lastname: requestor }
  ]
}).exec((err, users) => {
  if (err) return res.status.json({ err: "No user(s) found" });

  Ticket.find({
    requestor: {
      $in: users.map(doc => new ObjectId(doc._id))
    }
  }).exec((err, tickets) => {
    if (err) return res.status.json({ err: "No ticket(s) found" });

    // do something with 'tickets'
    tickets.forEach(doc => console.log(doc));
  });
});

為了解決我最初的問題,即如何使用我建立的查詢對象搜索票證以及使用$in查找與返回用戶關聯的票證,我想出了這個似乎很好用的解決方案。

query.requestor = { $in: users.map(doc => new ObjectId(doc._id)) };

設置query. 到我要搜索的字段,在這種情況下是requestor 這樣我就可以簡單地做我迄今為止一直在做的事情並做一個簡單的Ticket.find(query)

暫無
暫無

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

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