【问题标题】:Query the fields in 3 different nested arrays in same document in Mongoose?在 Mongoose 的同一文档中查询 3 个不同嵌套数组中的字段?
【发布时间】:2018-09-04 09:30:12
【问题描述】:

下面是我的架构设计

const Schema1 = mongoose.Schema({
      _id: false,
      id: { type: mongoose.Schema.Types.ObjectId,
        ref: 'UserinfoSchema' 
      },
      name: { type: String , default: null },
      from: { type: Date, default: Date.now }
})

const ProfileSchema = mongoose.Schema({
  profilename:{
    type: String,
    required: true
  },
  list:{
    acceptedList:[ Schema1 ],
    requestedList:[ Schema1 ],
    pendingList:[ Schema1 ]
  }
})

我想构建一个查询,它查询所有嵌套数组(即acceptedList、requestedList、pendingList)并找出id 是否存在,如果id 不存在于任何列表中,则更新requestedList。

任何技术都是有帮助的。性能是关键。

【问题讨论】:

    标签: mongodb mongoose mongodb-query mongoose-populate mongoose-plugins


    【解决方案1】:

    您可以使用$or 运算符来做到这一点:

    db.Collection.update({
        $or: {
            "list.acceptedList": {$nin: [your_id]},
            "list.requestedList": {$nin: [your_id]},
            "list.pendingList": {$nin: [your_id]}
        }
    }, {
        $addToSet: {
            "list.requestedList": your_id
        }   
    });
    

    $nin 运算符带有 [your_id] 检查您的 id 是否不在 3 个数组中,您必须使用 [] 因为它只允许数组。

    【讨论】:

    • 感谢您的回答。如何将上述查询用于 findByIdAndUpdate()?或 findById()?因为我想根据用户的 _id 更新特定的文档?
    • 我不明白你想用用户 ID 做什么,你不能像 SQL 那样加入集合,除了 $lookup 但我不认为你必须在这里使用它。如果您有您的用户 ID,请将其传递给我给您的请求
    • 是的,我明白了。现在一切正常。感谢您的回复。
    • 我不太明白你的问题。我认为你可以将你的条件放在过滤器部分,如果这可以满足你的需求,或者放在 javascript 部分。在更新部分之后,$pull for requestsList an $push to acceptedList
    【解决方案2】:

    因此,在您的 javascript 代码中,当用户接受请求时,您可以使用此查询(您必须先获取要插入到接受列表中的数据):

    db.Collection.update({
        _id: collection_id,
        "list.requestedList": request_id
    }, {
        $pull: {
            "list.requestedList": your_id // I re use what i give to you
        },
        $addToSet: {
            "list.acceptedList": your_id // or what you want
        }
    })
    

    【讨论】:

    • 连同 id 我必须保存 name 和 from fields 中的字段
    • 您不能使用现有字段的值来设置另一个,这就是为什么您必须先将数据放入acceptedList中
    • 非常感谢 Nicolas 澄清解决方案。
    • 没问题 ;) !
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2017-08-08
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多