Ваша переменная ids
будет построена из «строк», а не ObjectId
значений.
Мангустировать «autocasts» строковые значения для ObjectId
в их правильный тип в регулярных запросах, но это не происходит в конвейере агрегации , как описано в номере № 1399.
Вместо этого вы должны выполнить правильное литье, чтобы ввести вручную:
ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })
Затем вы можете использовать их в своем конвейере:
{ "$match": { "_id": { "$in": ids } } }
Причина в том, что конвейеры агрегации «обычно» изменяют структуру документа, и поэтому mongoose не делает никаких предположений о том, что «схема» применяется к документу на любой стадии конвейера.
Можно утверждать, что этап «первого» конвейера, когда это этап $match
, должен сделать это, поскольку документ действительно не изменяется. Но сейчас это не так.
Любые значения, которые могут быть «строками» или, по крайней мере, не корректным типом BSON, должны быть вручную отобраны для соответствия.
Для соединения с несколькими базами данных вам необходимо добавить следующие коды в файл database.yml. Здесь я приведу пример соединения двух баз данных из приложения rails
config / database.yml
development:
adapter: mysql2
database: db1_dev
username: root
password: xyz
host: localhost
development_sec:
adapter: mysql2
database: db2_dev
username: root
password: xyz
host: localhost
production:
adapter: mysql2
database: db1_prod
username: root
password: xyz
host: your-production-ip
production_sec:
adapter: mysql2
database: db2_prod
username: root
password: xyz
host: your-production-ip
Здесь я использовал две базы данных для среды разработки и производства.
Теперь нам нужно подключить модель к базам данных. Когда вы запускаете ваше приложение в режиме разработки и производства, все модели будут отображаться с помощью параметров db разработки и производства, которые были упомянуты в вашем database.yml. Поэтому для некоторой модели нам нужно подключиться к другой базе данных.
Предположим, что у нас есть две модели User и Category. Таблица пользователей находится в db1_dev и db1_prod, таблица категорий в db2_dev и db2_prod.
Модель категории
class Category < ActiveRecord::Base
establish_connection "#{Rails.env}_sec"
end
Аналогично, когда вы добавляете новую миграцию для второй базы данных, необходимо добавить следующий код к ней.
class CreateRewards < ActiveRecord::Migration
def connection
ActiveRecord::Base.establish_connection("#{Rails.env}_sec").connection
end
def change
# your code goes here.
end
end
Надеюсь, это сработает для вас :).
Используйте establish_connection
для переключения на другую базу данных:
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:host => "localhost",
:username => "myuser",
:password => "mypass",
:database => "somedatabase"
)
Вы также можете передать предварительно сконфигурированную среду из database.yml, например:
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['other_env'])
Вы также можете установить его для конкретной модели:
MyClass.establish_connection(...)