我有一个这样的对象:
{ "_id": { "$oid": "5f0047f02fd3fc048aab9ee9" }, "array": [ { "_id": { "$oid": "5f00dcc23e12b8721e4f3672" }, "name": "NAME", "sub_array": [ { "sub_array2": [ { "$oid": "5f00e367f7b8747beddc6d31" }, { "$oid": "5f00f26c1facd18c5158d1d3" } ], "_id": { "$oid": "5f00de99a8802e767885e72b" }, "week_day": 1 }, { "sub_array2": [ { "$oid": "5f00e367f7b8747beddc6d31" } ], "_id": { "$oid": "5f00f2501facd18c5158d1d2" }, "week_day": 3 } ] }, { "_id": { "$oid": "5f00f2401facd18c5158d1d1" }, "name": "NAME1", "sub_array": [] } ] }我想用另一个集合中的对象替换sub_array id,但这导致将 array 和 sub_array 转换为对象,并丢失所有数据,例如 week_day .查找:
I want to replace sub_array ids with objects from another collection but that results converting array and sub_array to objects and losing all of the data like week_day. Lookup:
'$lookup': { 'from': 'sati', 'localField': 'array.sub_array.sub_array2', 'foreignField': '_id', 'as': 'array.sub_array.sub_array2' }结果:
{ "_id": { "$oid": "5f0047f02fd3fc048aab9ee9" }, "array": { "sub_array": { "sub_array2": [ { "_id": { "$oid": "5f00e367f7b8747beddc6d31" }, "endTime": "2020-07-03T12:06:50+0000", "startTime": "2020-07-03T12:05:50+0000", "data1": { "$oid": "5f005e63ab1cbf2374d5163f" } }, { "_id": { "$oid": "5f00e367f7b8747beddc6d31" }, "endTime": "2020-07-03T12:06:50+0000", "startTime": "2020-07-03T12:05:50+0000", "data1": { "$oid": "5f005e63ab1cbf2374d5163f" } }, { "_id": { "$oid": "5f00e367f7b8747beddc6d31" }, "endTime": "2020-07-03T12:06:50+0000", "startTime": "2020-07-03T12:05:50+0000", "data1": { "$oid": "5f005e63ab1cbf2374d5163f" } } ] } } }有没有一种方法可以替换"单个ID,而无需将整个数组转换为对象并删除其他字段.我知道猫鼬可以做到这一点,但我不允许使用它.其他问题都没有帮助(示例).
Is there a way to "replace" the individual ids without converting entire arrays to objects and removing other fields. I know mongoose can do that but I'm not permitted to use it. None of the other questions helped (example).
推荐答案它将使用 $ lookup 结果覆盖整个对象 key:value .而是将查找结果存储在 sati 变量中,并添加一个额外的阶段,如下所示.
It will override entire object key:value with $lookup result. Instead, store the lookup result in the sati variable and add an extra stage like shown below.
$ map 允许对数组进行迭代并转换每个项目.
$map allows use iterate over an array and transform each item.
db.collection.aggregate([ { "$lookup": { "from": "sati", "localField": "array.sub_array.sub_array2", "foreignField": "_id", "as": "sati" } }, { $project: { array: { $map: { input: "$array", as: "array", in: { _id: "$$array._id", name: "$$array.name", sub_array: { $map: { input: "$$array.sub_array", as: "sub_array", in: { _id: "$$sub_array._id", week_day: "$$sub_array.week_day", sub_array2: { $filter: { input: "$sati", as: "sati_item", cond: { $in: [ "$$sati_item._id", "$$sub_array.sub_array2" ] } } } } } } } } } } } ])MongoPlayground |使用$ mergeObjects的替代方法
更多推荐
MongoDB $ lookup用对象数组替换
发布评论