gpt4 book ai didi

node.js - MongoDB:连接多个数组

转载 作者:可可西里 更新时间:2023-11-01 09:51:03 24 4
gpt4 key购买 nike

我有 3 个 ObjectIds 数组,我想连接成一个数组,然后按创建日期排序。 $setUnion正是我想要的,但我想尝试不使用它。

我要排序的对象的架构:

var chirpSchema = new mongoose.Schema({
interactions: {
_liked : ["55035390d3e910505be02ce2"] // [{ type: $oid, ref: "interaction" }]
, _shared : ["507f191e810c19729de860ea", "507f191e810c19729de860ea"] // [{ type: $oid, ref: "interaction" }]
, _viewed : ["507f1f77bcf86cd799439011"] // [{ type: $oid, ref: "interaction" }]
}
});

期望的结果:将 _liked、_shared 和 _viewed 连接到一个数组中,然后使用 aggregate 管道按创建日期对它们进行排序。见下文

["507f1f77bcf86cd799439011", "507f191e810c19729de860ea", "507f191e810c19729de860ea", "55035390d3e910505be02ce2"]

我知道我应该使用 $push$each$group$unwind 以某种组合或其他方式组合,但我无法拼凑文档来实现这一点。

更新:查询

model_user.aggregate([
{ $match : { '_id' : { $in : following } } }
, { $project : { 'interactions' : 1 } }
, { $project : {
"combined": { $setUnion : [
"$interactions._liked"
, "$interactions._shared"
, "$interactions._viewed"
]}
}}
])
.exec(function (err, data) {
if (err) return next(err);
next(data); // Combined is returning null
})

最佳答案

如果所有对象 _id 值都是“唯一的”,那么 $setUnion 是您的最佳选择。它当然不是以任何方式“排序”,因为它与“集合”一起使用,并且不能保证顺序。但您可以随时放松并 $sort。

[
{ "$project": {
"combined": { "$setUnion": [
{ "$ifNull": [ "$interactions._liked", [] ] },
{ "$ifNull": [ "$interactions._shared", [] ] },
{ "$ifNull", [ "$interactions._viewed", [] ] }
]}
}},
{ "$unwind": "$combined" },
{ "$sort": { "combined": 1 } },
{ "$group": {
"_id": "$_id",
"combined": { "$push": "$combined" }
}}
]

当然,由于这是一组不同的值,您可以使用旧方法代替 $addToSet,在每个数组上处理 $unwind 之后:

[
{ "$unwind": "$interactions._liked" },
{ "$unwind": "$interactions._shared" },
{ "$unwind": "$interactions._viewed" },
{ "$project": {
"interactions": 1,
"type": { "$const": [ "liked", "shared", "viewed" ] }
}}
{ "$unwind": "$type" },
{ "$group": {
"_id": "$_id",
"combined": {
"$addToSet": {
"$cond": [
{ "$eq": [ "$type", "liked" ] },
"$interactions._liked",
{ "$cond": [
{ "$eq": [ "$type", "shared" ] },
"$interactions._shared",
"$interactions._viewed"
]}
]
}
}
}},
{ "$unwind": "$combined" },
{ "$sort": { "combined": 1 } },
{ "$group": {
"_id": "$_id",
"combined": { "$push": "$combined" }
}}
]

但同样的事情也适用于订购。

future 的版本甚至可以连接数组而无需缩减为“集合”:

[
{ "$project": {
"combined": { "$concatArrays": [
"$interactions._liked",
"$interactions._shared",
"$interactions._viewed"
]}
}},
{ "$unwind": "$combined" },
{ "$sort": { "combined": 1 } },
{ "$group": {
"_id": "$_id",
"combined": { "$push": "$combined" }
}}
]

但是如果不处理 $unwind$sort 仍然无法重新排序结果。

因此,您可能会考虑,除非您需要跨多个文档进行分组,否则最好在客户端代码中处理基本的“连接和排序”操作。 MongoDB 目前无法在数组上“就地”执行此操作,因此客户端代码中的每个文档是最好的选择。

但是如果您确实需要对多个文档进行这种分组,那么这里显示的那种方法适合您。

另请注意,此处的“创建”是指创建 ObjectId 值本身,而不是引用对象的其他属性。如果您需要这些,那么您可以在聚合或查询之后对 id 值执行填充,当然还要在客户端代码中进行排序。

关于node.js - MongoDB:连接多个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32857063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com