mongoDB 搜索/过滤不参考架构的数据

Posted

技术标签:

【中文标题】mongoDB 搜索/过滤不参考架构的数据【英文标题】:mongooseDB search/filter for data that is NOT IN ref to a schema 【发布时间】:2021-12-26 11:38:11 【问题描述】:

我有两个模式“巨石”和“位置”,如下所示:

巨石模式:

const mongoose = require('mongoose');
const Schema = mongoose

const boulderSchema = new Schema(
    name: 
        type: String,
        required: true
    ,
    grade: 
        type: String,
        required: true
    
);

const Boulder = mongoose.model('Boulder', boulderSchema);
module.exports = Boulder;

和位置架构:

const mongoose = require('mongoose');
const Schema = mongoose

const locationSchema = new Schema(
    area: 
        type: String,
        required: true
    ,
    place: 
        type: String,
        required: true
    ,
    latitude: 
        type: Number,
        required: true
    ,
    longitude: 
        type: Number,
        required: true
    ,
    boulders: [type: Schema.Types.ObjectId, ref:'Boulder']
)


const Location = mongoose.model('Location', locationSchema);
module.exports = Location;

我已经播种了一些用于开发目的的初始数据。我这样做的方式是使用随机数量的巨石并将随机数量插入我拥有的一组位置。例如,如果我有巨石 ["A","B","C"...etc] 和位置 ["1","2","3"...] 等等,那么位置 1 可能有一个随机2 块巨石的数量 = A 和 B。问题在于,由于我有大约 50 个位置和 500 个巨石,随机数意味着有一些巨石不在“参考”中,但有“位置”。所以它们存在于 Boulder.Schema 但它没有通过 [ref:'Boulder'] 连接到 Location.Schema

我的问题是:如何找到()这组没有位置的巨石,然后如何将它们全部删除?查询在 MongoDB 中搜索事物的新功能。谢谢!!

【问题讨论】:

【参考方案1】:

我还没有尝试过,但我认为这可以工作:

    找到所有位置
const locations = await Location.find().exec();
    填充巨石参考
const populatedLocations = locations.populate('boulders');
    在没有任何参考的情况下过滤掉位置的巨石
const refBoulders = populatedLocations.map((populatedLocation) => 
    return 
      ...populatedLocation,
      boulders: populatedLocation.boulders.filter((boulder) => boulder !== null).map((boulder) => boulder._id)
    ;
);

现在在refBoulders 中,有位置的巨石 ID 在Boulder 架构中具有对应关系,只需保存即可。

await refBoulders.save();

【讨论】:

以上是关于mongoDB 搜索/过滤不参考架构的数据的主要内容,如果未能解决你的问题,请参考以下文章

mongodump按日期导出数据

搭建高可用mongodb集群(分片)

MongoDB - 对时间序列子文档进行范围查询

NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库

Ubuntu环境下安装mongodb

Mongodb中的过滤时间范围