我正在開發一個聊天應用程式,我正在像這樣將對話串列保存在資料庫中;
對話集:
{
members: [ "123", "456" ]
...rest
}
和用戶集合:
{
_id: ObjectId( "123" ), name: "anyone"
},
{
_id: ObjectId( "456" ), name: "someone"
}
我希望結果是這樣的:
{
members: [
{_id: ObjectId( "123" ), name: "anyone"},
{_id: ObjectId( "456" ), name: someone"}
]
}
我知道使用查找聚合是一種拯救,但找不到如何從該成員的陣列中獲取所有 id 的方法,因為將來它可能是 20 到 30 個 id。如果它是一個簡單的欄位,那么我可以獲取但使用陣列,我不能。
我試過這個
db.conversations.aggregate([
{
"$lookup": {
"from": "users",
"localField": "members",
"foreignField": "_id",
"as": "members_details"
}
}
])
但它回傳 members_details: [ ]
uj5u.com熱心網友回復:
您可以使用以下查詢來完成您想要的。您將需要使用,$lookup因為您希望從與您當前查詢的集合不同的集合中收集資料。
您可以在此處查看現場演示
這是一個更新的現場演示
資料庫
db={
"conversations": [
{
members: [
123,
456
]
}
],
"users": [
{
"_id": 123,
"name": "foo"
},
{
"_id": 456,
"name": "bar"
}
]
}
詢問
db.conversations.aggregate([
{
"$lookup": {
"from": "users",
"localField": "members",
"foreignField": "_id",
"as": "members"
}
},
{
$project: {
_id: 0,
members: 1
}
}
])
結果
[
{
"members": [
{
"_id": 123,
"name": "foo"
},
{
"_id": 456,
"name": "bar"
}
]
}
]
更新
在此處查看新的現場演示
新查詢
db.conversations.aggregate([
{
$unwind: "$members"
},
{
"$lookup": {
"from": "users",
"as": "membersFlat",
"let": {
memberObjectId: {
"$toObjectId": "$members"
}
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$$memberObjectId",
"$_id"
]
}
}
}
]
}
},
{
$group: {
_id: null,
members: {
$push: {
"_id": {
$first: "$membersFlat._id"
},
"name": {
$first: "$membersFlat.name"
}
}
}
}
},
{
$project: {
_id: 0
}
}
])
新結果
[
{
"members": [
{
"_id": ObjectId("124578987898787845658574"),
"name": "foo"
},
{
"_id": ObjectId("124578986532124578986532"),
"name": "bar"
}
]
}
]
uj5u.com熱心網友回復:
您可以使用這樣的法線.find():
const members = [
ObjectId('4ed3ede8844f0f351100000c'),
ObjectId('4ed3f117a844e0471100000d'),
ObjectId('4ed3f18132f50c491100000e')
]
const docs = await model.find({
'_id': { $in: members }
}).exec()
uj5u.com熱心網友回復:
由于您的membersid 是對話集合中的字串,您可以將其轉換為物件 id 并加入用戶集合,
$addFields更新members陣列$map迭代members陣列回圈$toObjectId將字串物件 id 型別轉換為物件 id 型別
db.conversations.aggregate([
{
$addFields: {
members: {
$map: {
input: "$members",
in: {
$toObjectId: "$$this"
}
}
}
}
},
{
$lookup: {
from: "users",
localField: "members",
foreignField: "_id",
as: "members"
}
}
])
操場
uj5u.com熱心網友回復:
安裝貓鼬自動填充。在你的模型代碼中
import {Schema, model} from 'mongoose';
const modelSchema = new Schema({
...
chats: [{type: Schema.Types.ObjectId, ref: "Chat", autopopulate: true}]
})
modelSchema.plugin(require('mongoose-autopopulate'));
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/321269.html
標籤:节点.js MongoDB 表达 猫鼬 mongodb-查询
上一篇:郵遞員不作業的簡單洗掉請求
