猫鼬如何使用数组查询子文档数组?

时间:2019-08-25 11:39:43

标签: javascript node.js mongodb mongoose

我正在建立一个新服务器,使用mongoDB作为数据库,并使用mongoose与之交互。我将带有标签的图像链接保存在数据库中,所有图像都具有通用标签:*(在保存新图像时会进行检索和保存) 我想检索具有所有给定标签的图像。

这是图像的架构

const mongoose = require('mongoose');

const imageSchema = mongoose.Schema({
  link: {
    type: String,
    required: true
  },
  tags: {
    type: [{
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Tag'
    ]},
    default: []
  }
});

consy Image = mongoose.model('Image', imageSchema);

这是标签的架构

const mongoose = require('mongoose');

const tagSchema = mongoose.Schema({
  name: {
    type: String,
    required: true,
    unique: true,
    trim: true,
    maxlength: 20,
    lowercase: true
  }
});

const Tag = mongoose.model('Tag', tagSchema);

这是我尝试过的

Image.find({
  tags: {
    $elemMatch: {
      name: { $in: ['*'] }
    }
  }
}).populate('tags');

还有

Image.find({
  'tags.name': { $in: ['*'] }
}).populate('tags');

但是我没有图像。 但是当我做一个简单的Image.find().populate('tags');时,我的确得到了所有带有属性标签的图像,这些属性标签是一组对象,只有一个对象的标签名称为*

我做错了什么?

2 个答案:

答案 0 :(得分:0)

要查找通用标签,我们可以使用$regex。请找到以下查询以检索所有带有Image.find({ 'tags.name': { $regex: /\*/, $options: 'i' } })

的标签
needs_reload

答案 1 :(得分:0)

如果您要查找带有'*'标签的所有图像,也许可以尝试-

find().
populate({
  path: 'tags',
  match: { name: '*' }
}).
exec();

我认为此链接对您有用-https://mongoosejs.com/docs/populate.html#query-conditions