节点猫鼬嵌入文档数组

时间:2021-05-06 14:12:41

标签: mongodb mongoose

我在这里有我的示例 userSchema:

{
    "_id": objectId("6092076ba811e50b565497ec"),
    "username": "test@gmail.com",
    "address_book": [{
        "_id": objectId("6092b1120f7e370b954a2708"),
        "address": "address1",
        "address2": "address2",
    }, {
        "_id": objectId("6093edcb88796b0a5eba19a3"),
        "address": "test1",
       "address2": "test2",
    }]
}

我可以通过以下方式找到用户吗 objectId("6092076ba811e50b565497ec")address_book._id object("6093edcb88796b0a5eba19a3")

它只返回我选择的 address_book 吗?我的预期回报数据应该是这样的

{
    "_id": objectId("6092076ba811e50b565497ec"),
    "username": "test@gmail.com",
    "address_book": {
        "_id": objectId("6093edcb88796b0a5eba19a3"),
        "address": "test1",
       "address2": "test2",
    }
}

这是我的示例函数

let user = [];
await User.findOne({
   _id: id,
   "address_book._id": address_id,
 })
.then((result) => {
   console.log(result);
   user = result;
 })
 .catch((err) => console.log(err));
 return user;

有了这个,我就得到了所有的地址簿

还有是否可以通过address_book._id实现updateOrCreate函数?

提前致谢。

2 个答案:

答案 0 :(得分:1)

elemMatch 根据我的说法是你正在寻找的。 elemMatch 用于投影,而不仅仅是匹配。

    db.<collection name>.find({
  < search using elem match >
}, {
  games: {
    $elemMatch: {
      //put your projection piece here, whatever selective what you want, check the example on documentation
      score: {
        $gt: 5
      }
    }
  },
  //anything else that you would want apart from within array projection
})

更新:

数据

    [
  {
    "_id": "6092076ba811e50b565497ec",
    "username": "test@gmail.com",
    "address_book": [
      {
        "_id": "6092b1120f7e370b954a2708",
        "address": "address1",
        "address2": "address2",
        
      },
      {
        "_id": "6093edcb88796b0a5eba19a3",
        "address": "test1",
        "address2": "test2",
        
      }
    ]
  }
]

命令

db.collection.find({},
{
  address_book: {
    $elemMatch: {
      address: "test1"
    }
  }
})

结果

[
  {
    "_id": "6092076ba811e50b565497ec",
    "address_book": [
      {
        "_id": "6093edcb88796b0a5eba19a3",
        "address": "test1",
        "address2": "test2"
      }
    ]
  }
]

Playground

答案 1 :(得分:1)

从 MongoDB 4.4 开始,您可以在 find 方法中使用聚合运算符,

  • $filter 迭代 address_book 数组的循环并匹配 _id 条件
  • $first 从上面的过滤结果中选择第一个元素
await User.findOne({
  _id: id,
  "address_book._id": address_id
},
{
  username: 1,
  address_book: {
    $first: {
      $filter: {
        input: "$address_book",
        cond: { $eq: ["$$this._id", mongoose.Types.ObjectId(address_id)] }
      }
    }
  }
})

Playground