Пн goose, найти по элементу в массиве - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь найти все документы с определенным значением в поле массива, используя Mon goose и Node.js. Я могу сделать это в MongoDB без проблем, но у меня возникают трудности в понедельник goose. Я использовал Найти документ с массивом, который содержит спецификацию c значение в качестве руководства, как это сделать, но я не получаю ожидаемых результатов. Моя модель:

const mongoose = require("mongoose");

const Schema = mongoose.Schema;
const ApptSchema = new Schema({
  store: { type: String, required: true },
  dotw: { type: String, required: true },
  month: { type: Number, required: true },
  day: { type: Number, required: true },
  hr: { type: Number, required: true },
  min: { type: Number, required: true },
  customers: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
  full: { type: Boolean, required: true, default: false }
});

const Appt = mongoose.model("Appt", ApptSchema);

module.exports = Appt;

Я хочу найти все документы, которые содержат определенный идентификатор клиента. В оболочке MongoDB это то, что я бы сделал:

db.appts.find({customers: "5e7e3bc4ac4f196474d8bf69"})

Это работает, как и ожидалось, предоставляя мне все документы (в данном случае один документ), где этот идентификатор находится в массиве customers.

{ "_id" : ObjectId("5e7e719c806ef76b35b4fd69"), "customers" : [ "5e7e3bc4ac4f196474d8bf69" ], "full" : false, "store" : "Nashville", "dotw" : "Friday", "month" : 4, "day" : 15, "hr" : 13, "min" : 0 }

В понедельник goose это то, что я пытаюсь:

Appt.find({ customers: "5e7e3bc4ac4f196474d8bf69" }, (err, docs) => {
    if (err) {
      console.log(err);
    } else {
      console.log(docs);
    }
  });

Это печатает пустой массив, даже если есть документ, где этот идентификатор находится в customers массив. Кажется, это должно сработать, но мне явно не хватает какой-то части головоломки. Любое понимание того, что я делаю неправильно, будет очень цениться.

Редактировать: Если кто-то захочет / захочет взглянуть более подробно, репозиторий приложения GitHub пока может можно найти здесь . Запрос находится в маршрутах / маршрутах. js в строке 111 (на момент написания).

Другое редактирование: похоже, это как-то связано с типом схемы рассматриваемого поля. , Я удалил атрибут ref записей в поле customers, на всякий случай, если это вызывало проблему, но мой запрос все еще возвращал пустой массив. Следующим тестом было добавление нового поля в мою модель, myStrings: [String]. Затем я добавил строку в массив одного из моих документов Appt, "working", и запросил Appt.find({myStrings: "working"}), и это, наконец, возвращает документ Appt, который я обновил. Это говорит мне, что есть что-то странное в работе с mongoose.Schema.Types.ObjectId, но я не могу понять, как ее решить.

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: После долгих бед, эта проблема решена. Проблема заключалась в следующем ... Для тестирования я добавлял элементы в свою базу данных, используя оболочку MongoDB, которая не поддерживает типы данных, как Mon goose. Я не осознавал, что просто добавляю идентификаторы пользователей в виде строк в массив customers. Когда Mon goose отправился на поиск ObjectIds, он, конечно, не нашел и возвратил пустой массив. При добавлении клиентов в массив customers с помощью db.appts.updateOne({<whatever information>},{$push:{customers: new ObjectId(<id string>)}}) Mon goose смог вернуть информацию, которую я искал.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

добавить поле _id:

Appt.find({ customers._id: "5e7e3bc4ac4f196474d8bf69" }, (err, docs) => {
if (err) {
  console.log(err);
} else {
  console.log(docs);
}});
0 голосов
/ 28 марта 2020

Я бы сказал, что ваша проблема в том, что вы используете строку в фильтре, где поле имеет тип ObjectId. Поэтому вам необходимо сначала преобразовать строку в ObjectId для mon goose, чтобы иметь возможность правильно запросить ее.

Appt.find({ customers: mongoose.Types.ObjectId("5e7e3bc4ac4f196474d8bf69") }, (err, docs) => {});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...