【问题标题】:mongoose query: find an object by id in an array猫鼬查询:在数组中按 id 查找对象
【发布时间】:2017-03-28 13:40:19
【问题描述】:

如何在此架构中按 id 找到图像。我有用户的 ID 和我正在寻找的图像的 ID。最好的方法是什么?在这种情况下,所有图像都具有不同的 id,或者它们是否具有相同的 id,因为它们不属于同一个用户?

我的架构如下所示:

var userSchema = new Schema({
  local: {
    email: String,
    password: String
  },
  facebook: {
    id: String,
    token: String,
    email: String,
    name: String
  },
  name: String,
  about: String,
  images: [{
    id: Schema.ObjectId,
    link: String,
    main: Boolean
  }]
});

【问题讨论】:

  • 您是对整个对象感兴趣还是只对具有指定 id 的图像感兴趣?
  • 我更喜欢一个完整的对象,其中只有一个具有传递 id 的图像。

标签: arrays mongodb mongoose objectid


【解决方案1】:
userSchema .find({facebook.id: "some ID",{ "images.id": { $in: [ id1, id2, ...idn] }}

由于图像在文档中,您可以拥有相同的 ID,但是每次查询时都应记住,您发送一些其他参数,例如 facebook.id 或 facebook.email 以及图像 ID 以检索它们。否则,您最终会得到所有可能无关紧要的信息,因为您决定为图像保留相同的 ID。

【讨论】:

    【解决方案2】:

    当您对完整对象感兴趣时,它是一个简单的find

    .find({"facebook.id":"<id>", "images.id":<image-id>})
    

    我认为没有办法减少结果中的图像数组。

    要更新图像数组中的单个元素,您可以使用:

    .update({"facebook.id":"<id>", "images.id":<image-id>}, {$set : {"images.$.main" :false} } );
    

    【讨论】:

    • 这正是我的问题。我只需要更新该图像中的一个字段,并且不知道如何获取该图像。还有其他的硬伤吗?感谢您的帮助。
    【解决方案3】:

    tl;博士

    我为此苦苦挣扎,并想出了一个解决方案。像你一样,我试图通过_id 查询一个深度嵌套的对象,但结果一直是空的。直到我进行了一些类型检查,我才意识到我从前端获得的 id 值虽然直接由 mongoose 提供,但实际上是 String 而不是 Object

    我意识到这个问题之前已经部分回答了,但是那个人的解决方案对我不起作用,并且对答案的评论告诉我你想更新你查询的特定图像,这正是我正在尝试的去做。

    解决办法

    为了通过 _id 值从嵌套数组中选择一个对象,首先您必须安装 npm 包 bson-objectid 并使用提供的方法将您的字符串转换为查询中的 objectId .

    在您的终端中:

    npm i bson-objectid
    

    在您的代码中:

    const ObjectId = require('bson-objectid')
    
    userSchema.findOneAndUpdate(
        { "facebook.id": <user-id>, "images._id": ObjectId(<image-id>) },
        { "$set": { "images.$.main": false } }, 
        { new: true }, // an extra options parameter that returns the mutated document
        (err, user) => {
            if (err) {
                handleErr(err)
            } else {
                console.log(user)
                // do something with new user info
            }
    )
    

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多