Найдите ключевые слова в массиве и получите только соответствующие элементы в MongoDB, используя NodeJS - PullRequest
1 голос
/ 07 мая 2020

У меня есть актив коллекции, и это мои данные

{
  "_id" : ObjectId("5e71d235a3b5401685a058"),
  "company" : ObjectId("5e6b834b5991d70945840"),
  "asset_name" : "LG-OLED-55-Inch",
  "installedAt" : ["lobby", "storeroom", "f105"],
}
{
  "_id" : ObjectId("5e71d235a3b540168475d8"),
  "company" : ObjectId("5e6b834b5991d70945840"),
  "asset_name" : "LG-OLED-32-Inch",
  "installedAt" : ["lobby", "f108"],
}
{
  "_id" : ObjectId("5eb3d53a7e16dc70244d6578"),
 "company" : ObjectId("5e6b834b5991d70945840"),
  "asset_name" : "LG-OLED-68-Inch",
  "installedAt" : ["tvroom", "f105"],
}
{
  "_id" : ObjectId("5eb3d53a7e16dc7024474a12"),
 "company" : ObjectId("5e6b834b5991d70945840"),
  "asset_name" : "LG-OLED-22-Inch",
  "installedAt" : ["tvroom"],
}

Итак, для приведенных выше данных мое требование состоит в том, чтобы искать ключевое слово в installedAt и возвращать все элементы, соответствующие ключевому слову, которое пользователь предоставляет .

Например, если пользователь ищет f10, тогда мы должны искать все массивы installedAt в assests и возвращать, как показано ниже

"installedAt": ["f105","f108"]

И я попытался использовать $in для получения похожих элементов, но он работает не так, как я ожидал. Это мой запрос

 var autoRecords =[];
    key = [searchString];        
    key.forEach(function(opt){
        autoRecords.push(new RegExp(opt,"i"));                
    }); 

Assets.find({ "installedAt" : {"$in" : autoRecords},"company": companyId},{"installedAt" : 1})

Итак, для приведенного выше запроса, когда я пытаюсь отправить текст для поиска, который равен f10, результат будет следующим:

[
{"installedAt":["lobby", "storeroom", "f105"],"_id":"5e71d235a3b5401685a058"},
{"installedAt":["lobby", "f108"],"_id":"5e71d235a3b540168475d8"},
{"installedAt":["tvroom", "f105"],"_id":"5eb3d53a7e16dc70244d6578"},
]

Он получает все элементы в массив installedAt, даже если он его найдет. Итак, может ли кто-нибудь помочь мне получить только согласованные элементы в массиве и попытаться получить этот формат

"installedAt": ["f105","f108"]

1 Ответ

0 голосов
/ 07 мая 2020

Вы можете использовать агрегирование ниже

const data = await Assets.aggregate([
  { $match: { installedAt: { $regex: "f10", $options: "i" }}},
  { $unwind: "$installedAt" },
  { $match: { installedAt: { $regex: "f10", $options: "i" }}},
  { $group: {
    _id: null,
    data: { $addToSet: "$installedAt" }
  }}
])

MongoPlayground

...