Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB:连接多个数组_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Node.js MongoDB:连接多个数组

Node.js MongoDB:连接多个数组,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我有3个objectid的数组,我想连接成一个数组,然后按创建日期排序。这正是我想要的,但我不想使用它 我要排序的对象的架构: var chirpSchema = new mongoose.Schema({ interactions: { _liked : ["55035390d3e910505be02ce2"] // [{ type: $oid, ref: "interaction" }] , _shared : ["507f191e810c19

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

我要排序的对象的架构:

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" }]
  }
});
所需结果:将“喜欢的”、“共享的”和“查看的”连接到单个数组中,然后使用
聚合
管道按创建日期对它们进行排序。见下文

["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
})

如果所有对象
\u id
值都是“唯一的”,那么
$setUnion
是您的最佳选择。它当然不是以任何方式“有序”的,因为它与“集合”一起工作,这并不保证有序。但你总是可以放松和整理

[
{“$project”:{
“合并”:{“$setUnion”:[
{“$ifNull”:[“$interactions.\u喜欢”,[]},
{“$ifNull”:[“$interactions.\u shared”,[]},
{“$ifNull”,[“$interactions.\u viewed”,[]}
]}
}},
{“$unwind”:“$COMPONED”},
{“$sort”:{“合并”:1},
{“$组”:{
“\u id”:“$\u id”,
“合并”:{“$push”:“$combined”}
}}
]
当然,由于这是一组不同的值,因此在处理每个数组上的
$unwind
后,您可以用老方法使用
$addToSet

[
{“$REWIND”:“$interactions.\u喜欢”},
{“$unwind”:“$interactions.\u shared”},
{“$unwind”:“$interactions.\u viewed”},
{“$project”:{
"互动":一,,
“类型:{“$const”:[“喜欢”、“共享”、“查看过”]}
}}
{“$unwind”:“$type”},
{“$组”:{
“\u id”:“$\u id”,
“合并”:{
“$addToSet”:{
“$cond”:[
{“$eq”:[“$type”,“liked”]},
“$interactions.\u喜欢”,
{“$cond”:[
{“$eq”:[“$type”,“shared”]},
“$interactions.\u共享”,
“$interactions.\u已查看”
]}
]
}
}
}},
{“$unwind”:“$COMPONED”},
{“$sort”:{“合并”:1},
{“$组”:{
“\u id”:“$\u id”,
“合并”:{“$push”:“$combined”}
}}
]
但同样的事情也适用于订购

未来的版本甚至能够连接阵列,而不减少到“集合”:

[
{“$project”:{
“合并”:{“$concatarray”:[
“$interactions.\u喜欢”,
“$interactions.\u共享”,
“$interactions.\u已查看”
]}
}},
{“$unwind”:“$COMPONED”},
{“$sort”:{“合并”:1},
{“$组”:{
“\u id”:“$\u id”,
“合并”:{“$push”:“$combined”}
}}
]
但是,如果不执行
$unwind
$sort
,仍然无法对结果重新排序

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

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


还要注意,“创建”在这里意味着创建ObjectId值本身,而不是从引用对象创建其他属性。如果需要,则在聚合或查询之后对id值执行填充操作,当然还可以在客户端代码中进行排序。

如果可以“连接”数组,则不能“按日期排序”。您似乎在引用其他集合中引用的数据中的“日期”等信息。MunGDB不以任何方式执行连接,并且MangoSOS填充也不是连接,也不能在聚合流水线的中间执行。也就是说,
ObjectId
值包含一个日期组件,因此如果足够的话,它们至少会按照创建顺序排序。@BlakesSeven,很抱歉我没有说得更具体一些。按创作顺序排序是我需要的。你能告诉我连接是如何完成的吗,或者给我指一个资源吗?谢谢你的回答!遇到一些问题,我可能做错了什么-combined正在为我返回
null
。请参阅问题更新。@danm07请确保您匹配的内容实际上包含所有数组。可以使用
$ifNull
包装每个元素,以返回不存在的空数组。同时松开先前的
$project
。不管怎么说,它没有任何用处,可能是您的SQL思维让您认为您需要它。添加了
$ifNull
包装作为示例。我也这么认为。我正在尝试更新架构-。-“出于好奇,您知道当我对Mongoose进行更改时,Mongoose是否会自动更新其架构,还是需要手动更新架构?@danm07应用程序重启始终是代码更改所必需的。与mongoose无关,只是编译器一般。