从mongodb的另一个发现中找到

时间:2016-06-10 11:38:04

标签: mongodb mongodb-query spring-data-mongodb

在Mysql中,我可以从另一个选择中选择。 所以我会问我是否可以在Mongodb中做同样的事情。

有关更多说明,我需要仅使用此集合的userOwner对象中的最后dateTransaction来检索特定history的事务。如果此userOwner不是在上一段历史中,我们不会撤销这笔交易。

我首先使用了这个查询:

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

但它会返回所有元素,即使这个userOwner没有最后一个“dateTransaction”的元素。

所以我的目标是为每个事务返回一个查询,它只返回最后一个带有“history”数组的userOwner的dateTransaction:

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

之后再从这一个查询。

任何人都有想法或例子。

TNX

这是我的名为“piece”的集合:

{
    "_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 个答案:

答案 0 :(得分: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"
}

在处理更复杂的查询时,请考虑以当前形式拆分该集合会给您带来很多麻烦