2016-06-10 58 views
0

在Mysql中,我可以从另一个Select中进行选择。 所以我会问,如果我能在Mongodb做同样的事情。在mongodb中查找另一个发现

详细的解释,我需要在这个collection.So的history对象与刚刚过去的dateTransaction中检索的特定userOwner的交易,如果这userOwner是不是在过去历史中,我们shoudn't检索到此交易。

我起初这个查询使用:

@Query(value = "{'history':{'$elemMatch':{'userOwner': ?0}}}") 

但它返回甚至所有元素那些本userOwner是不是最后一个“dateTransaction”。

所以我的目标是去它返回每次交易刚刚过去dateTransaction与“历史”阵列的userOwner查询:

.find({},{dateTransaction: {$slice: 1} }).limit(1) 

,做从这个彼此询问之后。

任何人都有一个想法或例子。

TNX

这是我收集所谓的 “作品”:

{ 
    "_id" : ObjectId("1"), 
    "history" : [{ 
      "userOwner" : "3", 
      "dateTransaction" : ISODate("2016-05-30T00:00:00.000+0000"), 
     }, { 
      "userOwner" : "1", 
      "dateTransaction" : ISODate("2016-05-26T00:00:00.000+0000"), 
     }, { 
      "userOwner" : "2", 
      "dateTransaction" : ISODate("2016-05-23T00:00:00.000+0000"), 
     } 
    ] 
}{ 
    "_id" : ObjectId("2"), 
    "transactions" : [{ 
      "userOwner" : "2", 
      "dateTransaction" : ISODate("2016-05-26T00:00:00.000+0000"), 
     }, { 
      "userOwner" : "3", 
      "dateTransaction" : ISODate("2016-05-15T00:00:00.000+0000"), 
     } 
    ] 
}{ 
    "_id" : ObjectId("3"), 
    "transactions" : [{ 
      "userOwner" : "2", 
      "dateTransaction" : ISODate("2016-05-26T00:00:00.000+0000"), 
     }, { 
      "userOwner" : "1", 
      "dateTransaction" : ISODate("2016-05-15T00:00:00.000+0000"), 
     } 
    ] 
} 

作为例子为userOwner 2的结果应该是:

{ 
    "_id" : ObjectId("2"), 
    "transactions" : [{ 
      "userOwner" : "2", 
      "dateTransaction" : ISODate("2016-05-26T00:00:00.000+0000"), 
     }, { 
      "userOwner" : "3", 
      "dateTransaction" : ISODate("2016-05-15T00:00:00.000+0000"), 
     } 
    ] 
}{ 
    "_id" : ObjectId("3"), 
    "transactions" : [{ 
      "userOwner" : "2", 
      "dateTransaction" : ISODate("2016-05-26T00:00:00.000+0000"), 
     }, { 
      "userOwner" : "1", 
      "dateTransaction" : ISODate("2016-05-15T00:00:00.000+0000"), 
     } 
    ] 

} 
+1

你能否添加一些冗长?你知道你的头是什么,不,我们不:-) – profesor79

+0

我的问题是可以理解的吗?我需要帮助。 – ShMswi

+0

是否只有一个集合或更多?从select中选择可以有很多含义? – profesor79

回答

0

它看起来像你的数据存储在一个集合 - 所以这是一种不好的设计,因为它需要更多的开销来处理....

下面聚集查询具有查询到相同的收集,为用户匹配数据:2

var unwind = { 
    $unwind : "$history" 
} 
var matchUser = { 
    $match : { 
     "history.userOwner" : "2" 
    } 
} 
var lookUp = { 
    $lookup : { 
     from : "shm", 
     localField : "userOwner", 
     foreignField : "userOwner", 
     as : "t" 
    } 
} 

var unwindTransactions = { 
    $unwind : "$t" 
} 
var unwindTransactions2 = { 
    $unwind : "$t.transactions" 
} 
var match2 = { 
    $match : { 
     "t.transactions.userOwner" : "2" 
    } 
} 
var project = { 
    $project : { 
     _id : 0, 
     recordId : "$_id", 
     transactionId : "$t._id", 
     dateOfTransaction : "$history.dateTransaction", 
     userOwner : "$history.userOwner", 
    } 
} 

db.shm.aggregate([unwind, 
     matchUser, 
     lookUp, 
     unwindTransactions, 
     unwindTransactions2, 
     match2, 
     project 
    ]) 

,因此,我们有用户交易的两个记录

{ 
    "recordId" : ObjectId("575e7e8b852cb76369c9e446"), 
    "transactionId" : ObjectId("575e7e8b852cb76369c9e447"), 
    "dateOfTransaction" : ISODate("2016-05-23T00:00:00.000Z"), 
    "userOwner" : "2" 
},{ 
    "recordId" : ObjectId("575e7e8b852cb76369c9e446"), 
    "transactionId" : ObjectId("575e7e8b852cb76369c9e448"), 
    "dateOfTransaction" : ISODate("2016-05-23T00:00:00.000Z"), 
    "userOwner" : "2" 
} 

请考虑收集的分裂因为在处理更复杂的查询时,以目前的形式会给你很多头痛的问题

相关问题