WedX - журнал о программировании и компьютерных науках

Найти по _id в массиве объектов в базе данных mongodb

Я пытаюсь найти идентификатор объекта внутри массива объектов. Этот _id имеет то же имя поля _id, что и другие в документе. Это моя модель (кратко)

var CardSchema = new mongoose.Schema({
  beName: String,
  beLink: String,
  cards: [{ 
    cardType: String,
    cardBundle: String
  }]

Это образец содержимого моей базы данных

_id: ObjectId(5a52540638086448bf4235e8)
beName: Name1
beLink: Link1
cards: Array
 0: Object
    cardType: type1
    cardBundle: 1
    _id: ObjectId(5a526749d0ddab4bcdcc1556)
 1: Object
    cardType: type2
    cardBundle: 1
    _id: ObjectId(5a526749d0ddab4bcdcc1557)

...

_id: ObjectId(5a52540638086448bf4235e9)
beName: Namex
beLink: Linkx
cards: Array
 0: Object
    cardType: typex
    cardBundle: x
    _id: ObjectId(5a526749d0ddab4bcdcc1598)
 1: Object
    cardType: type2
    cardBundle: 1
    _id: ObjectId(5a526749d0ddab4bcdcc1599)

Я пытаюсь найти идентификатор конкретной карты, подобной этой

Cards.find({ _id: req.params.id}, function (err, post) {
    if (err) return next(err);
    res.json(post);
  });

Но я получаю пустой результат

я тоже пробовал

Cards.find({ _id: new ObjectId(req.params.id)}...

  • Вы знаете _id объекта карты? 08.01.2018
  • да, я знаю идентификатор карты, это часть запроса URL 08.01.2018
  • этот _id на объекте карты генерируется монго, это не часть моей схемы мангуста 08.01.2018
  • Вы пытаетесь найти идентификаторы в массиве карт? или в основном документе? Если это идентификатор в массиве, вы можете попробовать Cards.find().select({'cards': {$elemMatch: {'_id':mongoose.Types.ObjectId(req.params.id)}}}) 08.01.2018

Ответы:


1

Вероятно, вам нужно использовать функцию aggregate для $unwind массива карточек, чтобы найти совпадающую карточку на основе _id.

поэтому в мангусте вместо find используйте aggregate конвейер

образец документа

> db.cards.findOne()
{
    "_id" : ObjectId("5a52f4136fe82b42b7439a21"),
    "beName" : "Name1",
    "beLink" : "Link1",
    "cards" : [
        {
            "cardType" : "type1",
            "cardBundle" : 1,
            "_id" : "5a52f3a66f112b42b7439a20"
        },
        {
            "cardType" : "type2",
            "cardBundle" : 1,
            "_id" : "5a52f3a66f112b42b7439a21"
        }
    ]
}

агрегатная функция

> db.cards.aggregate([{$unwind: "$cards"}, {$match:{"cards._id" : "5a52f3a66f112b42b7439a20"}}] )

документ результатов

> db.cards.aggregate([{$unwind: "$cards"}, {$match:{"cards._id" : "5a52f3a66f112b42b7439a20"}}] ).pretty()
{
    "_id" : ObjectId("5a52f4136fe82b42b7439a21"),
    "beName" : "Name1",
    "beLink" : "Link1",
    "cards" : {
        "cardType" : "type1",
        "cardBundle" : 1,
        "_id" : "5a52f3a66f112b42b7439a20"
    }
}
> 

Вы можете дополнительно оптимизировать его, если знаете родительский элемент _id, в совокупном конвейере $match по родительскому элементу _id, затем $unwind, затем $match на карте массива _id

> db.cards.aggregate([{$match:{"_id":ObjectId("5a52f4136fe82b42b7439a21")}},{$unwind: "$cards"}, {$match:{"cards._id" : "5a52f3a66f112b42b7439a20"}}] )
08.01.2018

2

Вопрос немного расплывчатый, но, глядя на другие ответы и имея _id карты в URL-адресе, я думаю, у вас есть _id карты, и вы хотите найти родительский документ. если правда, то вам не нужен агрегат. поисковый запрос просто выполняет свою работу:

db.cards.find({"cards._id": _id})

04.06.2021

3

Попробуйте сделать это так:

const ObjectId = require("mongodb").ObjectID,

/* some other statements */

let cardId = new ObjectId(req.params.id)
Cards.find({ _id: cardId}, function (err, post) {
    if (err) return next(err);
    res.json(post);
});

Для справки: https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html

08.01.2018
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]