【问题标题】:Mongoose: Match UserIDs with Embedded DocumentMongoose:将用户 ID 与嵌入式文档匹配
【发布时间】:2023-03-22 16:37:01
【问题描述】:

我想要实现的是将人们彼此匹配。 为了实现这种行为,我将 Match 文档嵌入到用户的匹配数组中。

这是我的User 模特

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

const Match = new Schema({
    with: {type: Schema.Types.ObjectId, ref: 'User'},
    near: {type:String},
    createdAt: {type:Date, default: Date.now}
 });


const UserSchema = new Schema({
    name: { type: String, default: '' },
    surname: { type: String, default: '' },
    email: { type: String, default: '', },
    salt: { type: String, default: '' },
    hashed_password: { type: String, default: '' },
    interested: { type: [String] },
    about: { type: String },
    createdAt: {type:Date, default:Date.now},
    devices: {type: [String]},
    matches: [Match]
 });

但对于可靠的应用程序逻辑, 用户不得匹配两次。我的计划是将匹配的人一起插入到他们的匹配数组中,

例如;

User A
_id: 123
matches: [{with: 456,near:California,createdAt:someDateTime}] 

User B
_id: 456
matches: [{with: 123,near:California,createdAt:someDateTime}] 

在匹配发生之前,我需要控制之前是否匹配过任何用户,并且必须是atomic

谢谢。

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    也许这行得通:

    const Match = new Schema({
        matchedIds: [ {type:string} ]
        near: {type:String},
        createdAt: {type:Date, default: Date.now}
     });
    

    所以matchedIds 只包含两个用户ID。然后您可以找到匹配项:

    db.match.find( { matchedIds: { $all: ["UserID 1", "UserID 2"] } } )
    

    【讨论】:

    • 但它本身不是模型或模式,它只是一个嵌入的文档。那我怎么查询呢?
    • @AlicanYilmaz 对不起,我太快了。将比赛存储在自己的收藏中不是更容易吗?您可以从两个用户那里引用它,并在一个用户决定撤消匹配时自动删除引用。
    • 我最近的设计是这样的,我正在单独收集火柴。但在这种情况下,问题就大了。当查询并发执行时,匹配集合的 save() 会同时运行两次。这依赖于一个很大的不一致问题。在这里你可以关注它; stackoverflow.com/questions/47718970/mongoose-atomic-save?rq=1
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2018-02-27
    • 2017-12-26
    • 2011-12-21
    • 2017-06-22
    • 2018-08-11
    相关资源
    最近更新 更多